Command-Line

為尾巴著色不同的來源

  • August 19, 2014

我正在看不同的日誌

tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log

如何使每個日誌的輸出顏色不同?

使用 GNUgrep進行著色:

color() { GREP_COLOR=$1 grep --color '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

請注意,前 2 個是在後台啟動的。這意味著如果您按下它們不會被殺死Ctrl-C(shell 顯式忽略非同步作業的 SIGINT)。

為了防止這種情況,您可以改為:

color() { GREP_COLOR=$1 grep --line-buffered --color=always '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33) | cat

這樣,在上,(SIGINTCtrl-C的)最後一個tail+grepcatdie 以及另外兩個 grep+tail 將在下次他們寫東西時死於 SIGPIPE。

或者恢復 SIGINT 處理程序(不適用於所有 shell):

color() { GREP_COLOR=$1 grep --color '.*'; }

((trap - INT; tail -qf /var/log/syslog | color 31) &
(trap - INT; tail -qf /var/log/fail2ban.log | color 32) &
tail -qf /var/log/nginx/error.log | color 33)

您也可以在color函式中執行此操作。這不適用於SIGPIPE tail,但tail如果死了,它會在下次寫入時grep死於 SIGPIPE。

color() (trap - INT; GREP_COLOR=$1 exec grep --color '.*')

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

或者使整個 tail+grep 成為一個函式:

tailc() (trap - INT; export GREP_COLOR="$1"; shift; tail -qf -- "$@" |
  grep --color '.*')
tailc 31 /var/log/syslog &
tailc 32 /var/log/syslog &
tailc 33 /var/log/nginx/error.log

或者整個事情:

tailc() (
 while [ "$#" -ge 2 ]; do
   (trap - INT; tail -f -- "$2" | GREP_COLOR=$1 grep --color '.*') &
   shift 2
 done
 wait
)

tailc 31 /var/log/syslog 32 /var/log/syslog 33 /var/log/nginx/error.log

引用自:https://unix.stackexchange.com/questions/150925