欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

shell腳本實現(xiàn)分日志級別輸出的方法

 更新時間:2017年03月17日 10:06:59   投稿:jingxian  
下面小編就為大家?guī)硪黄猻hell腳本實現(xiàn)分日志級別輸出的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

shell腳本如何優(yōu)雅的記錄日志信息,下面讓我們一步一步,讓shell腳本的日志也變得高端起來,實現(xiàn)如下功能

①設(shè)定日志級別,實現(xiàn)可以輸出不同級別的日志信息,方便調(diào)試

②日志格式類似為:[日志級別] 時間 funcname:函數(shù)名 [lineno:行號] 日志信息

③不同級別,設(shè)定不同顏色

④讓其變?yōu)楹瘮?shù)庫文件,重用代碼

下面看看我用shell記錄日志的進化之路

1.最簡單的日志記錄方式

對于剛?cè)腴T的同學,記錄日志一般用echo加重定向方式,這應該是最原始的方式了^_^

echo "log message" > file

2.簡單函數(shù)封裝,簡化重復寫重定向到日志文件

當你想記錄的日志變多,你得重復的寫echo “”>$logfile,這也是件挺麻煩的事情,于是我就寫了個log函數(shù),這樣修改的時候也比較方便。

log() {
  msg=$1
  echo $msg > log.file
}

3.實現(xiàn)日志的級別不同顏色輸出

某天使用某腳本的時候,報錯了確沒發(fā)現(xiàn),于是就想將報錯信息用不同顏色字體,這樣會稍微友好一點,請看下面函數(shù)

function log {
  local text;local logtype
  logfile=./log.txt
  logtype=$1
  text=$2
  #其實可以再將日志的格式定義為一個字符串,這樣就不用重復寫`date +'%F %H:%M:%S'`\t$1\t$2\033[0m,又可以省好多代碼。
  case $logtype in 
    error)
      echo -e "\033[31m`date +'%F %H:%M:%S'`\t$1\t$2\033[0m" | tee -a $logfile;;
    info)
      echo -e "\033[32m`date +'%F %H:%M:%S'`\t$1\t$2\033[0m" | tee -a $logfile;;
    warn)
      echo -e "\033[33m`date +'%F %H:%M:%S'`\t$1\t$2\033[0m" | tee -a $logfile;;
  esac
}

4.實現(xiàn)設(shè)定日志級別,輸出不同級別以上的日志,方便調(diào)試

學了Python的日志模塊后,想著如何像python那樣,可以設(shè)定日志級別,比如設(shè)定debug,那么只有debug級別以上的日志會輸出,而且日志的格式也支持定義,常見格式 如下:[日志級別] 時間 funcname:函數(shù)名 [lineno:行號] 日志信息

請看如下的log函數(shù):大家可以將log函數(shù)放到一個單獨文件,稱為函數(shù)庫文件,然后寫腳本的時候,通過source或 . 命令引入,就想python的導入模塊一樣,重用log的代碼

#!/bin/bash
#可將log函數(shù)單獨放一個文件,通過.命令引入,這樣就可以共用了
#. log.sh 
#設(shè)置日志級別
loglevel=0 #debug:0; info:1; warn:2; error:3
logfile=$0".log"
function log {
    local msg;local logtype
    logtype=$1
    msg=$2
    datetime=`date +'%F %H:%M:%S'`
    #使用內(nèi)置變量$LINENO不行,不能顯示調(diào)用那一行行號
    #logformat="[${logtype}]\t${datetime}\tfuncname:${FUNCNAME[@]} [line:$LINENO]\t${msg}"
    logformat="[${logtype}]\t${datetime}\tfuncname: ${FUNCNAME[@]/log/}\t[line:`caller 0 | awk '{print$1}'`]\t${msg}"
    #funname格式為log error main,如何取中間的error字段,去掉log好辦,再去掉main,用echo awk? ${FUNCNAME[0]}不能滿足多層函數(shù)嵌套
    {  
    case $logtype in 
        debug)
            [[ $loglevel -le 0 ]] && echo -e "\033[30m${logformat}\033[0m" ;;
        info)
            [[ $loglevel -le 1 ]] && echo -e "\033[32m${logformat}\033[0m" ;;
        warn)
            [[ $loglevel -le 2 ]] && echo -e "\033[33m${logformat}\033[0m" ;;
        error)
            [[ $loglevel -le 3 ]] && echo -e "\033[31m${logformat}\033[0m" ;;
    esac
    } | tee -a $logfile
}
#以下為測試
debug () {
    log debug "there are $# parameters:$@"
}
info() {
    log info "funcname:${FUNCNAME[@]},lineno:$LINENO"
}
warn() {
    log warn "funcname:${FUNCNAME[0]},lineno:$LINENO"
}
error() {
    log error "the first para:$1;the second para:$2"
}
set -x
debug first second
set +x
info first second
warn first second 
error first second

輸出如下:

在寫這個函數(shù)的遇到一個問題就是不能用內(nèi)建變量$LINENO來取得調(diào)用的行號,只能取得log函數(shù)中定義$LINENO那一行,搜了許久找到的解決辦法是利用caller命令,關(guān)于caller命令的用法,如下:

5.caller的用法

caller命令放到函數(shù)中, 將會在stdout上打印出函數(shù)的調(diào)用者信息.,caller命令也可以在一個被source的腳本中返回調(diào)用者信息. 當然這個調(diào)用者就是source這個腳本的腳本. 就像函數(shù)一樣, 這是一個”子例程調(diào)用”.你會發(fā)現(xiàn)這個命令在調(diào)試的時候特別有用.

 #!/bin/bash

 function1 ()
 {
  # 在 function1 () 內(nèi)部.
  caller 0  # 顯示調(diào)用者信息.
 }

 function1  # 腳本的第9行.

 # 9 main test.sh
 # ^         函數(shù)調(diào)用者所在的行號.
 #  ^^^^      從腳本的"main"部分開始調(diào)用的.
 #    ^^^^^^^  調(diào)用腳本的名字.

 caller 0   # 沒效果, 因為這個命令不在函數(shù)中.

以上這篇shell腳本實現(xiàn)分日志級別輸出的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • shell SNAT與DNAT的使用與區(qū)別

    shell SNAT與DNAT的使用與區(qū)別

    本文主要介紹了shell SNAT與DNAT的使用與區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • linux crontab 實現(xiàn)每秒執(zhí)行的實例

    linux crontab 實現(xiàn)每秒執(zhí)行的實例

    下面小編就為大家?guī)硪黄猯inux crontab 實現(xiàn)每秒執(zhí)行的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Shell最多支持多少個參數(shù)?

    Shell最多支持多少個參數(shù)?

    這篇文章主要介紹了Shell最多支持多少個參數(shù)?本文是對Shell最多可以輸入多少個參數(shù)的一篇測試文章,需要的朋友可以參考下
    2014-10-10
  • 使用fdisk命令管理磁盤分區(qū)詳解

    使用fdisk命令管理磁盤分區(qū)詳解

    這篇文章主要為大家介紹了使用fdisk命令管理磁盤分區(qū)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Linux磁盤空間被未知資源耗盡的解決方法

    Linux磁盤空間被未知資源耗盡的解決方法

    下面小編就為大家?guī)硪黄狶inux磁盤空間被未知資源耗盡的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Shell腳本實現(xiàn)把進程負載均衡到多核CPU中

    Shell腳本實現(xiàn)把進程負載均衡到多核CPU中

    這篇文章主要介紹了Shell腳本實現(xiàn)把進程負載均衡到多核CPU中,可以把進程指定運行在某個CPU中,需要的朋友可以參考下
    2014-06-06
  • Linux paste命令用法匯總

    Linux paste命令用法匯總

    paste命令是linux下的一個文件管理命令,paste命令可以把每個文件以列對列的方式,然后一列列地加以合并,也就是合并兩個文件,這篇文章主要介紹了Linux paste命令使用方法,感興趣的朋友一起看看吧
    2022-12-12
  • 一個Shell小腳本精準統(tǒng)計Mysql每張表的行數(shù)實現(xiàn)

    一個Shell小腳本精準統(tǒng)計Mysql每張表的行數(shù)實現(xiàn)

    這篇文章主要介紹了一個Shell小腳本精準統(tǒng)計Mysql每張表的行數(shù)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Linux中mysqldump命令實例詳解

    Linux中mysqldump命令實例詳解

    mysqldump是mysql數(shù)據(jù)庫中備份工具,用于將MYSQL服務器中的數(shù)據(jù)庫以標準的sql語言的方式導出,并保存到文件中。今天通過本文給大家介紹mysqldump命令實例詳解,一起看看吧
    2016-12-12
  • Shell腳本調(diào)快調(diào)慢系統(tǒng)時間(測試服務器時使用)

    Shell腳本調(diào)快調(diào)慢系統(tǒng)時間(測試服務器時使用)

    這篇文章主要介紹了Shell腳本修改系統(tǒng)時間(測試服務器時使用),本文腳本用于調(diào)快或者調(diào)慢系統(tǒng)時間,需要的朋友可以參考下
    2014-12-12

最新評論