Systemd: формат вывода журнала по умолчанию
Мне интересно, если выход по умолчанию для journalctl
можно отрегулировать Таким образом, пользовательский шаблон может быть предоставлен.
Например, я хотел бы:
- показать уровень журнала (например, приоритет)
- настроить фиксированную ширину столбца для определенных полей журнала
- включить вывод цвета
Я привык к возможностям, которые Java каркасы журналирования, такие как Log4j2
укажите, где я могу просто указать шаблон журнала для настройки формата вывода сообщений журнала. Есть ли journalctl
поддержать такой механизм?
Примечание: я знаю о -o, --output=
вариант но ищу что то более мелкозернистое.
1 ответ
Нет. Journalctl - это инструмент запросов, а не инструмент форматирования. У него есть некоторые параметры форматирования, но это не log4j2. DigitalOcean имеет хорошую запись:
JournalTL JSON вывода по конвейеру JQ может быть достаточно.
Я написал свою собственную функцию Shell, которая может предоставить то, что вы просили.
function rl() {
## rl: read log
## journalctl wrapper with nice output format and colors based on log event severity.
## The order is for human consumption only so they are just based on RFC 5424 (without being compliant) and the default journalctl short-iso format.
## The syslog severity is added. This one is missing in all common log formats or not human readable (RFC 5424).
## The time format is based on systemd.time(7) and RFC 3339.
## The colors are made up by ypid because I could not find a proper standard.
## Ref: https://faultserver.ru/questions/59262/bash-print-stderr-in-red-color/502019#502019
## Ref: https://faultserver.ru/questions/801514/systemd-default-log-output-format
# shellcheck disable=SC2016
command journalctl "$@" -o json \
| jq --unbuffered --raw-output '"echo \(.PRIORITY|tonumber|@sh) \"$(date --date @\((._SOURCE_REALTIME_TIMESTAMP // .__REALTIME_TIMESTAMP) |tonumber | ./ 1000000 | tostring) '\''+%F %T %Z'\'')\" \(._HOSTNAME|@sh) \(.SYSLOG_IDENTIFIER|@sh): \(.MESSAGE | gsub("\n"; "\n ") | @sh) "' \
| sh \
| perl -e 'my $c_to_sev = {0 => "48;5;9", 1 => "48;5;5", 2 => "38;5;9", 3 => "38;5;1", 4 => "38;5;5", 5 => "38;5;2", 6 => "38;5;2"}; while (<>) { s#^(([0-6])(?: [^ ]+){5})(.*)#\e[$c_to_sev->{$2}m$1\e[m$3#; print; }'
}
(Или проверьте https://github.com/ypid/scripts/blob/master/rl)
Я согласен, что это выглядит немного загадочно и немного медленнее, чем при использовании journalctl
непосредственно. Так что вы можете сначала использовать journalctl
с поиском, чтобы найти то, что вы ищете, а затем использовать rl
с фильтром. Поскольку у меня не получилось найти способ создания команд оболочки на основе полей журнала и их ИСПОЛНЕНИЯ, я немного подумал, чтобы гарантировать, что вы не сможете получить удаленное выполнение кода, используя журналы, сформированные мужчинами. Если вы найдете способ, пожалуйста, дайте мне знать;-)
Пример выходной строки выглядит следующим образом:
6 2019-09-06 00:01:55 CEST debops-dev-deb-10 systemd: Starting Daily man-db regeneration...