Я смотрю разные логи
tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log
Как можно по-разному раскрасить выходные данные каждого журнала?
multitail
и ответы на этот вопрос
Я смотрю разные логи
tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log
Как можно по-разному раскрасить выходные данные каждого журнала?
multitail
и ответы на этот вопрос
Ответы:
Использование 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
tailc
функцию, которая работала лучше всего и выглядит наиболее интуитивно понятной в сценарии.
Что-то вроде этого сработало для меня:
(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
реализациях).