我想知道是否可以调整默认输出journalctl
。这样就可以提供自定义模式。
例如我想:
- 显示日志级别(例如优先级)
- 为某些日记帐字段配置固定列宽
- 启用输出着色
我习惯使用 Java 日志框架Log4j2
提供的功能,例如,我可以简单地指定日志模式来调整日志消息的输出格式。是否journalctl
支持这样的机制?
注意:我知道这个-o, --output=
选项,但我正在寻找更细粒度的东西。
答案1
不是。journalctl 是一个查询工具,而不是格式化工具。它有一些格式化选项,但它不是 log4j2。DigitalOcean 有一篇很好的文章:
通过管道传输到 jq 的 journalctl json 输出可能就足够了。
答案2
我编写了自己的 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://serverfault.com/questions/59262/bash-print-stderr-in-red-color/502019#502019
## Ref: https://serverfault.com/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
过滤器。因为我没有找到一种基于日志字段生成 shell 命令并执行它的方法,所以我花了一些心思来确保你无法使用男性格式的日志进行远程代码执行。如果你找到了方法,请告诉我 ;-)
示例输出行如下所示:
6 2019-09-06 00:01:55 CEST debops-dev-deb-10 systemd: Starting Daily man-db regeneration...