Окраска разных источников для хвоста

19

Я смотрю разные логи

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

Как можно по-разному раскрасить выходные данные каждого журнала?

Даниэль В.
источник
@MattBianco спасибо, я посмотрю multitailи ответы на этот вопрос
Дэниел В.
1
В дополнение к отличным ответам, приведенным ниже, вы также можете проверить unix.stackexchange.com/questions/26313/colored-find-output, в котором показано, как сделать гораздо больше при раскрашивании выходных файлов.
Джо

Ответы:

21

Использование GNU grepдля раскраски:

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(оболочка явно игнорирует 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

Таким образом Ctrl-C, последний tail+grepи catумрет (от SIGINT) и два других хвоста grep + умрут от SIGPIPE в следующий раз, когда они что-то напишут.

Или восстановите обработчик SIGINT (не будет работать со всеми оболочками):

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функции. Это не относится к tail, но tailумрет от SIGPIPE в следующий раз, когда он пишет, если grepумрет.

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)

Или сделайте весь хвост + 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
Стефан Шазелас
источник
Когда я помещаю это в мой скрипт «watch.sh», он возвращается к моей консоли, но сообщения печатаются, см. I.imgur.com/yaiBwMo.png
Дэниел В.
@ Дан, см. Редактирование
Стефан Шазелас
Спасибо за ваши усилия в написании этого ответа, я выбрал tailcфункцию, которая работала лучше всего и выглядит наиболее интуитивно понятной в сценарии.
Дэниел В.
4

Что-то вроде этого сработало для меня:

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

Объяснение:

  • tail -f file: добавление данных по мере роста файла
  • awk -W interactive: установить awkинтерактивный режим
  • '{printf "\033[1;31m%s\033[0m\n", $0}' распечатайте вывод colorzized на терминал.
  • \033[1;31m означает красный
  • \033[1;32m означает зеленый
  • \033[1;34m означает синий
хаос
источник
-W interactiveкажется mawk-специфичным. (способ mawkбуферизации входных данных по умолчанию также уникален и -W interactiveне требуется в других awkреализациях).
Стефан Шазелас