自上次重新启动服务以来,有没有一种规范的方法可以从journalctl获取所有日志?我想要做的是重新启动服务并立即查看自启动重新启动以来的所有日志。
我想出了:
$ unit=prometheus
$ sudo systemctl restart $unit
$ since=$(systemctl show $unit | grep StateChangeTimestamp= | awk -F= '{print $2}')
$ sudo systemctl status -n0 $unit && sudo journalctl -f -u $unit -S "$since"
这可能会起作用,但我想知道是否有更具体的方法可以说:重新启动并给我从该点开始的所有日志。
答案1
您可以使用调用ID,这是服务单元的特定运行的唯一标识符。
它是介绍在 systemd v232 中,因此您至少需要该版本的 systemd 才能正常工作。
要获取当前运行的服务的调用 ID:
$ unit=prometheus
$ systemctl show -p InvocationID --value "$unit"
0e486642eb5b4caeaa5ed1c56010d5cf
然后搜索附加了该调用 ID 的日记条目:
$ journalctl INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf + _SYSTEMD_INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf
我发现您需要 INVOCATION_ID 和 _SYSTEMD_INVOCATION_ID 才能获取所有日志。后者由 systemd 添加,用于该单元本身输出的日志(例如,在该服务中运行的进程的标准输出),而前者附加到 systemd 获取的事件(例如,该单元的“正在启动”和“已启动”消息)。 )
请注意,你不需要也可以按单位名称进行过滤。由于调用 id 是唯一的,因此通过 id 本身进行过滤就足以仅包含您感兴趣的服务的日志。
答案2
虽然我从 @filbranden 的答案中学到了一些新东西并接受了它,但我发现该技术并不能概括。例如,如果我想停止某个服务并查看其关闭日志,则该技术不起作用,因为停止的服务没有 invoiceID。
我最终使用了一种更基本的技术——简单地存储命令之前的时间并显示自该时间以来的所有日志。
status_from() { sudo systemctl status -l --no-pager -n0 $1; echo; sudo journalctl -f -u $1 -S "$2"; }
start() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl start $1; status_from $1 "$dt"; }
stop() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl stop $1; status_from $1 "$dt"; }
restart() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl restart $1; status_from $1 "$dt"; }