著色問題

著色問題

我想更改使用 wim、less 或其他方式顯示大(約 6000 行)日誌檔案的方式,以簡化問題檢查。

我想根據模式突出顯示日誌的某些行(即,,error... )和/或隱藏其他一些行。warninginfo

我可以使用哪些工具?我只需要一個 shell 腳本嗎?重要的是,在過程之後,我可以使用 less、vim、... 讀取輸出來執行搜尋操作!

編輯:日誌的一小部分:

2016/10/25 12:19:24.403355 INFO <ServiceManager.cpp#2614 TID#3> Security object has NOT been parsed
2016/10/25 12:19:24.403369 INFO <ServiceManager.cpp#1263 TID#3> Service object sequence started
2016/10/25 12:19:24.403372 DBG <ServiceManager.cpp#1276 TID#3> preinvoke succeeded

答案1

我會推薦一個 shell 腳本,基於awk類似 Valentin B. 的解決方案:

$ cat colorize
awk '
function color(c,s) {
        printf("\033[%dm%s\033[0m\n",30+c,s)
}
/error/ {color(1,$0);next}
/success/ {color(2,$0);next}
/warning/ {color(3,$0);next}
/INFO/ {color(4,$0);next}
/DBG/ {color(5,$0);next}
{print}
' $1

為了能夠互動式地查看彩色輸出,我將less在原始模式下使用,例如:

colorize mylog.txt | less -R

答案2

awk正如其他答案中所提到的,絕對是首先要達到的工具。

但從長遠來看,它並不是唯一的工具。

AL 蘭伯特logtool是專門為後處理日誌檔案而設計的,並且有一個複雜的(可惜文件記錄得很糟糕)配置系統,允許將一個充滿正則表達式的文件分配給 13 種顏色中的每一種。

貓 *.log |日誌工具

它的特點是可以理解具有 TAI64N 時間戳記的日誌。

為此,添加:

著色問題

遺憾的是,其中一些工具的著色效果非常錯誤。他們硬連線控制序列,而不是使用terminfo 中的setaf/setab等。

另請注意,由於更微妙的原因,著色很棘手,幾乎沒有著色程序可以正確處理。為了完全正確,著色器必須處理自動邊距和 DEC VT待處理換行機制,我還沒有看到任何著色器這樣做。 GNUgrep在這個領域有一個相當著名的著色錯誤,但這不僅僅是一個問題grep

進一步閱讀

答案3

勾選後,可以直接在終端機中使用 輸出彩色文字awk。透過您提供的範例,您可以建立一個displayLog.awk包含以下程式碼的 awk 腳本檔案(例如 ):

# output INFO lines in cyan
$3 == "INFO" {
    print "\033[36m"$0"\033[0m"
    next
}

# don't display DBG lines
$3 == "DBG" {
    next
}

# output WARNING lines in bright yellow
$3 == "WARNING" {
    print "\033[1;33m"$0"\033[0m"
    next
}

# output ERROR lines in bright red
$3 == "ERROR" {
    print "\033[1;31m"$0"\033[0m"
    next
}

# If you want to skip all other lines, comment next line
{print}

然後打開一個乾淨的終端機窗口,檢查顯示是否不受限制(您可以一次顯示所有 6000 行)並如下使用:

$ awk -f displayLog.awk log.txt

或者讚用戶伊利亞格雷在他的解決方案中建議,將其傳輸到原始模式less

$ awk -f displayLog.awk log.txt | less -R

這應該夠了吧 !您可以根據我的答案中的範例程式碼來調整顏色以及要顯示的行awk。有關顏色編碼的更多信息這裡

編輯

如果您只想對一個單字而不是一整行進行著色(例如您希望 ERROR 僅顯示為紅色),請執行以下操作:

$3 == "ERROR" {
    $3 = "\033[1;31m"$3"\033[0m"
    print
    next
}

答案4

如果您想要根據模式(即錯誤、警告、訊息...)突出顯示日誌的某些行,請使用以下命令:

grep -rn "pattern" <logfile>

此命令將顯示日誌檔案的所有完整行,其模式如上所述。

相關內容