Answers:
从systemd
version开始232
,我们有了调用ID的概念。每次运行一个单元时,它都有一个唯一的128位调用ID。与MainPID
可以回收或ActiveEnterTimestamp
有解决问题的方法不同,它是获取特定systemd单元调用的所有日志的故障保护方法。
获取单元的最新调用ID
$ systemctl show --value -p InvocationID openipmi
bd3eb84c3aa74169a3dcad2af183885b
要获取最新调用(例如openipmi
,是否失败)的日志,可以使用一个内衬
$ journalctl _SYSTEMD_INVOCATION_ID=`systemctl show -p InvocationID --value openipmi.service`
-- Logs begin at Thu 2018-07-26 12:09:57 IDT, end at Mon 2019-07-08 01:32:50 IDT. --
Jun 21 13:03:13 build03.lbits openipmi[1552]: * Starting ipmi drivers
Jun 21 13:03:13 build03.lbits openipmi[1552]: ...fail!
Jun 21 13:03:13 build03.lbits openipmi[1552]: ...done.
(请注意,--value
自systemd 230
,早于可用InvocationID
)
我不确定哪个时间戳最有意义,但这对我有用。希望有一种systemctl show
比awk 更好的时间戳处理方法-无法弄清楚如何控制时间戳的格式。
unit=foo.service
ts=$(systemctl show -p ActiveEnterTimestamp $unit)
echo $ts
ActiveEnterTimestamp=Fri 2016-11-11 12:30:01 MST
journalctl -u $unit --since "$(echo $ts | awk '{print $2 $3}')"
systemctl show -p ActiveEnterTimestamp thermo.service | awk '{print $2 \" \" $3}'
” -fu thermo.service | 更少
systemctl show -p ActiveEnterTimestamp --value $unit
,因此不需要额外的awk
您可以使用引导标志来仅从该引导中获取日志。例如
journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5
您可以将字段过滤器与Journalctl一起使用。例如
journalctl _PID=1234
使用以下命令获取所有可用字段的列表:
journalctl --fields --unit kubelet
一个可用的字段是_PID
。
您可以使用pidof
或获取运行中进程的PIDsystemctl show --property MainPID <SERVICE_NAME>
所以这是我从当前Kubernetes kubelet进程中获取日志的方法:
# journalctl --unit kubelet _PID=$(systemctl show --property MainPID kubelet 2>/dev/null | cut -d= -f2) | head
现在告诉我为什么我这么难安装Kubernetes :-(
journalctl -r | grep -m1 foo.service
journalctl --user -u UNITFILE -f -o json-pretty
可能会有所帮助;您正在MESSAGE
特别寻找字段。我发现您可能还需要USER_INVOCATION_ID
,而且某些消息没有附加任何调用ID,因此无法通过此机制进行过滤。不知道为什么,也许我的日志记录配置错误..