shell指令碼如何優雅的記錄日誌資訊,下面讓我們一步一步,讓shell指令碼的日誌也變得高階起來,實現如下功能
①設定日誌級別,實現可以輸出不同級別的日誌資訊,方便除錯
②日誌格式類似為:[日誌級別] 時間 funcname:函式名 [lineno:行號] 日誌資訊
③不同級別,設定不同顏色
④讓其變為函式庫檔案,重用**
下面看看我用shell記錄日誌的進化之路
1.最簡單的日誌記錄方式
對於剛入門的同學,記錄日誌一般用echo加重定向方式,這應該是最原始的方式了^_^
echo "log message" > file
2.簡單函式封裝,簡化重複寫重定向到日誌檔案
當你想記錄的日誌變多,你得重複的寫echo umewb「」>$logfile,這也是件挺麻煩的事情,於是我就寫了個log函式,這樣修改的時候也比較方便。
log()
3.實現日誌的級別不同顏色輸出
某天使用某指令碼的時候,報錯了確沒發現,於是就想將報錯資訊用不同顏色字型,這樣會稍微友好一點,請看下面函式
function log
4.實現設定日誌級別,輸出不同級別以上的日誌,方便除錯
學了python的日誌模組後,想著如何像python那樣,可以設定日誌級別,比如設定debug,那麼只有debug級別以上的日誌會輸出,而且日誌的格式也支援定義,常見格式 如下:[日誌級別] 時間 funcname:函式名 [lineno:行號] 日誌資訊
請看如下的log函式:大家可以將log函式放到乙個單獨檔案,稱為函式庫檔案,然後寫指令碼的時候,通過source或 . 命令引入,就想python的匯入模組一樣,重用log的**
#!/bin/bash
#可將log函式單獨放乙個檔案,通過.命令引入,這樣就可以共用了
#. log.sh
#設定日誌級別
loglevel=0 #debug:0; info:1; warn:2; error:3
logfile=$0".log"
function log ]\t$\tfuncname:$ [line:$lineno]\t$"
logformat="[$]\t$\tfuncname: $\t[line:`caller 0 | awk ''`]\t$"
#funname格式為log error main,如何取中間的error欄位,去掉log好辦,再去掉main,用echo awk? $不能滿足多層函式巢狀
\033[0m" ;;
info)
[[ $loglevel -le 1 ]] && echo -e "\033[32m$\033[0m" ;;
warn)
[[ $loglevel -le 2 ]] && echo -e "\033[33m$\033[0m" ;;
error)
[[ $loglevel -le 3 ]] && echo -e "\033[31m$\033[0m" ;;
esac
} | tee -a $logfile
}#以下為測試
debug ()
info() ,lineno:$lineno"
}warn() ,lineno:$linenoumewb"
}error()
set -x
debug first second
set +x
info first second
warn first second
error first second
輸出如下:
在寫這個函式的遇到乙個問題就是不能用內建變數$lineno來取得呼叫的行號,只能取得log函式中定義$lineno那一行,搜了許久找到的解決辦法是利用caller命令,關於caller命令的用法,如下:
5.caller的用法
caller命令放到函式中, 將會在stdout上列印出函式的呼叫者資訊.,caller命令也可以在乙個被source的指令碼中返**用者資訊. 當然這個呼叫者就是source這個指令碼的指令碼. 就像函式一樣, 這是乙個」子例程呼叫」.你會發現這umewb個命令在除錯的時候特別有用.
#!/bin/bash程式設計客棧
function1 ()
function1 # 指令碼的第9行.
# 9 main test.sh
# ^ 函式呼叫者所在的行號.
# ^^^^ 從指令碼的"main"部分開始呼叫的.
# ^^^^^^^ 呼叫指令碼的名字.
caller 0 # 沒效果, 因為這個命令不在函式中.
本文標題: shell指令碼實現分日誌級別輸出的方法
本文位址:
Logback日誌 分日誌等級別輸出
一logback的介紹 logback是由log4j創始人設計的另乙個開源日誌元件,官方 它當前分為下面下個模組 二logback的配置介紹 logger context 各個logger 都被關聯到乙個 loggercontext,loggercontext負責製造logger,也負責以樹結構排列...
Logback日誌配置(分級別輸出到不同檔案)
專案使用springboot2.0 springboot2.0基於jdk1.8,不相容1.7 springboot1.5.x基於jdk1.7,相容1.8 專案結構圖如下 logback配置檔案名為logback spring.xml logging.config classpath log logb...
shell指令碼實現檢視tomcat日誌
logs catalina.out,每次查個log,都得進很深的目錄,很麻煩,浪費時間。而且來來回回就幾個命令。檢視專案實時輸出的日誌 指令碼名稱 cat catalina log.sh 指令碼執行方式 sh cat catalina log.sh tomcat 8108 bin bash tail...