shell指令碼實現分日誌級別輸出的方法

2022-10-03 09:24:09 字數 2306 閱讀 5799

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...