Kolorystyka różnych źródeł dla ogona

19

Oglądam różne dzienniki

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

Jak mogę inaczej wydrukować dane wyjściowe każdego dziennika?

Daniel W.
źródło
4
Zobacz także Jak wyświetlać kolorowe wydruki na
ogonie
@MattBianco dzięki, przyjrzę się multitaili odpowiedzi na to pytanie
Daniel W.
1
Oprócz świetnych odpowiedzi poniżej, możesz również sprawdzić unix.stackexchange.com/questions/26313/colored-find-output, który pokazuje, jak zrobić znacznie więcej z kolorowaniem plików wyjściowych.
Joe

Odpowiedzi:

21

Używanie GNU grepdo kolorowania:

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)

Zauważ, że pierwsze 2 są uruchamiane w tle. Oznacza to, że nie zostaną zabici, jeśli naciśniesz Ctrl-C(powłoka jawnie ignoruje SIGINT dla zadań asynchronicznych).

Aby temu zapobiec, możesz zamiast tego:

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

W ten sposób Ctrl-Costatni tail+grepi catumierają (SIGINT), a pozostałe dwa ogony grep + umrą z SIGPIPE następnym razem, gdy coś napiszą.

Lub przywróć procedurę obsługi SIGINT (nie będzie działać ze wszystkimi powłokami):

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)

Możesz to również zrobić w colorfunkcji. Nie dotyczy to tail, ale tailumrze z SIGPIPE następnym razem, gdy napisze, jeśli grepumrze.

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)

Lub uczyń cały ogon + grep funkcją:

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

Lub cała sprawa:

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
źródło
Po umieszczeniu tego w skrypcie „watch.sh” powraca do mojej konsoli, ale komunikaty są drukowane, patrz i.imgur.com/yaiBwMo.png
Daniel W.,
@ Dan, patrz edycja
Stéphane Chazelas,
Dziękuję za wysiłek w napisaniu tej odpowiedzi, wybrałem tailcfunkcję, która działała najlepiej i wygląda najbardziej intuicyjnie w skrypcie.
Daniel W.,
4

Coś takiego działało dla mnie:

(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}')

Wyjaśnienie:

  • tail -f file: dołączaj dane w miarę powiększania się pliku
  • awk -W interactive: ustaw awktryb interaktywny
  • '{printf "\033[1;31m%s\033[0m\n", $0}' wypisuje wyjście skolonizowane do terminala.
  • \033[1;31m oznacza czerwony
  • \033[1;32m oznacza zielony
  • \033[1;34m oznacza niebieski
chaos
źródło
-W interactivewydaje się być mawkspecyficzny. ( mawkdomyślnie sposób buforowania danych wejściowych jest unikalny i -W interactivenie byłby potrzebny w innych awkimplementacjach).
Stéphane Chazelas,