Mewarnai berbagai sumber untuk ekor

19

Saya menonton log yang berbeda

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

Bagaimana saya bisa membuat output setiap log berwarna berbeda?

Daniel W.
sumber
@MattBianco terima kasih, saya akan melihat ke dalam multitaildan jawaban dalam pertanyaan ini
Daniel W.
1
Selain jawaban hebat di bawah ini, Anda mungkin juga ingin memeriksa unix.stackexchange.com/questions/26313/colored-find-output yang menunjukkan cara melakukan lebih banyak hal dengan mewarnai file keluaran.
Joe

Jawaban:

21

Menggunakan GNU grepuntuk pewarnaan:

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)

Perhatikan bahwa 2 yang pertama dimulai di latar belakang. Itu berarti mereka tidak akan dibunuh jika Anda menekan Ctrl-C(shell secara eksplisit mengabaikan SIGINT untuk pekerjaan asinkron).

Untuk mencegahnya, Anda bisa melakukannya:

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

Dengan begitu, setelah Ctrl-C, yang terakhir tail+grepdan catmati (dari SIGINT) dan dua ekor grep + lainnya akan mati karena SIGPIPE pada saat mereka menulis sesuatu.

Atau kembalikan handler SIGINT (tidak akan bekerja dengan semua 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)

Anda juga dapat melakukannya di colorfungsi. Itu tidak berlaku untuk tail, tetapi tailakan mati karena SIGPIPE saat berikutnya ia menulis jika grepmati.

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)

Atau jadikan seluruh ekor + grep fungsi:

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

Atau semuanya:

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
Stéphane Chazelas
sumber
Ketika saya memasukkan ini ke dalam skrip "watch.sh" saya, skrip ini kembali ke konsol saya tetapi pesan dicetak, lihat i.imgur.com/yaiBwMo.png
Daniel W.
@Dan, lihat hasil edit
Stéphane Chazelas
Terima kasih atas usaha Anda dalam menulis jawaban ini, saya pergi dengan tailcfungsi yang bekerja paling baik dan terlihat paling intuitif dalam skrip.
Daniel W.
4

Sesuatu seperti ini bekerja untuk saya:

(tail -f /var/log/syslog | awk -W interactive '{printf "\033[1;31m%s\033[0m\n", $0}' & \
tail -f /var/log/auth.log | awk -W interactive '{printf "\033[1;32m%s\033[0m\n", $0}' & \
tail -f /var/log/Xorg.0.log | awk -W interactive '{printf "\033[1;34m%s\033[0m\n", $0}')

Penjelasan:

  • tail -f file: tambahkan data saat file bertambah
  • awk -W interactive: diatur awkke mode interaktif
  • '{printf "\033[1;31m%s\033[0m\n", $0}' cetak output yang dizinkan ke terminal.
  • \033[1;31m berarti merah
  • \033[1;32m berarti hijau
  • \033[1;34m artinya biru
kekacauan
sumber
-W interactivetampaknya menjadi- mawkspesifik. (cara mawkbuffer inputnya secara default juga unik, dan -W interactivetidak akan diperlukan dalam awkimplementasi lain ).
Stéphane Chazelas