最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年03月17日 10:06:59   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇shell腳本實(shí)現(xiàn)分日志級(jí)別輸出的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

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

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

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

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

下面看看我用shell記錄日志的進(jìn)化之路

1.最簡(jiǎn)單的日志記錄方式

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

echo "log message" > file

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

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

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

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

某天使用某腳本的時(shí)候,報(bào)錯(cuò)了確沒(méi)發(fā)現(xiàn),于是就想將報(bào)錯(cuò)信息用不同顏色字體,這樣會(huì)稍微友好一點(diǎn),請(qǐng)看下面函數(shù)

function log {
  local text;local logtype
  logfile=./log.txt
  logtype=$1
  text=$2
  #其實(shí)可以再將日志的格式定義為一個(gè)字符串,這樣就不用重復(fù)寫`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.實(shí)現(xiàn)設(shè)定日志級(jí)別,輸出不同級(jí)別以上的日志,方便調(diào)試

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

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

#!/bin/bash
#可將log函數(shù)單獨(dú)放一個(gè)文件,通過(guò).命令引入,這樣就可以共用了
#. log.sh 
#設(shè)置日志級(jí)別
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)用那一行行號(hà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
}
#以下為測(cè)試
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

輸出如下:

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

5.caller的用法

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

 #!/bin/bash

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

 function1  # 腳本的第9行.

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

 caller 0   # 沒(méi)效果, 因?yàn)檫@個(gè)命令不在函數(shù)中.

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

相關(guān)文章

  • 使用find命令快速定位配置文件位置

    使用find命令快速定位配置文件位置

    大家知道在配置的時(shí)候咱們經(jīng)常需要修改配置文件,甚至現(xiàn)在的開發(fā)就是配配配,記又記不住,每次自己查找太費(fèi)時(shí)間,最近學(xué)會(huì)了一個(gè)命令-find,現(xiàn)在分享以下,本文以nginx為例子給大家詳細(xì)介紹,對(duì)find命令定位配置文件位置相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-12-12
  • 快速入門Shell腳本之條件判斷語(yǔ)句與循環(huán)

    快速入門Shell腳本之條件判斷語(yǔ)句與循環(huán)

    這篇文章主要介紹了快速入門Shell腳本之條件判斷語(yǔ)句與循環(huán),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Shell中case...in分支語(yǔ)句的應(yīng)用

    Shell中case...in分支語(yǔ)句的應(yīng)用

    shell作為一種腳本編程語(yǔ)言,同樣包含循環(huán)、分支等其他程序控制結(jié)構(gòu),從而輕松完成更加復(fù)雜、強(qiáng)大的功能,本文主要介紹了Shell中case...in分支語(yǔ)句的應(yīng)用,感興趣的可以了解一下
    2023-08-08
  • 解決linux?shell中傳遞包含空格的參數(shù)問(wèn)題

    解決linux?shell中傳遞包含空格的參數(shù)問(wèn)題

    這篇文章主要介紹了如何解決linux?shell中傳遞包含空格的參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 獲取兩個(gè)日期間隔時(shí)間的shell腳本代碼

    獲取兩個(gè)日期間隔時(shí)間的shell腳本代碼

    獲取兩個(gè)日期間隔時(shí)間的shell腳本,對(duì)于正在研究shell操作日期的朋友來(lái)講,這個(gè)小例子,值得研究
    2013-02-02
  • linux自動(dòng)化交互腳本expect詳解

    linux自動(dòng)化交互腳本expect詳解

    這篇文章主要介紹了linux自動(dòng)化交互腳本expect的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • linux系統(tǒng)中的列出敏感用戶的腳本代碼

    linux系統(tǒng)中的列出敏感用戶的腳本代碼

    這里的敏感用戶是指這個(gè)用戶屬于多個(gè)組,或者這個(gè)用戶屬于的組名跟這個(gè)用戶名不一樣,需要的朋友可以參考下
    2014-09-09
  • shell腳本加密工具shc使用詳解

    shell腳本加密工具shc使用詳解

    Linux下的shell腳本用途廣泛,經(jīng)常包含IP、Pwd等關(guān)鍵信息,可讀可寫的特點(diǎn)很容易造成信息泄露,導(dǎo)致嚴(yán)重后果?;谶@些原因,對(duì)腳本實(shí)施加密便變得很有必要。本文介紹shell腳本加密工具應(yīng)用場(chǎng)景分析,一起看看吧
    2021-06-06
  • shell中數(shù)組的定義及操作

    shell中數(shù)組的定義及操作

    本文主要介紹了shell中數(shù)組的定義及操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • shell按行讀取文件的3種方法

    shell按行讀取文件的3種方法

    這篇文章主要介紹了shell按行讀取文件的3種方法,需要的朋友可以參考下
    2014-04-04

最新評(píng)論

石门县| 永修县| 龙井市| 扶沟县| 临潭县| 囊谦县| 东海县| 肇东市| 长阳| 泸西县| 绩溪县| 溧水县| 潍坊市| 平原县| 宣城市| 虞城县| 凤山县| 永宁县| 阳原县| 乳山市| 公主岭市| 项城市| 称多县| 乐山市| 大厂| 灵山县| 呼伦贝尔市| 古蔺县| 奉节县| 高唐县| 宜城市| 平乡县| 朝阳区| 印江| 樟树市| 黄冈市| 沐川县| 岫岩| 五台县| 辽阳市| 雅安市|