首页 > 解决方案 > systemd 日志游标如何工作?

问题描述

我在使用systemd日志光标时遇到问题。

如果 I SeekTail(),我会得到光标的值,并且可以继续调用 Next() 并且它的行为完全符合预期。

但是,如果我SeekCursor()然后调用Next()entry 它会跳回Head()并重新开始阅读。为什么会这样做?我可以验证它确实正确定位了光标。但就好像 SeekCursor 只对特定项目有效,仅此而已。这不是我阅读手册页和其他文档所期望的。

我正在使用CoreOS 项目中的go-systemdsystemd C-API ,它是.

但是 go 包装器不是问题,C 库才是。我可以看到 journalctl 在 Ubuntu 上做同样的事情。

例如附加到日志,显示尾部输出,在 json 中获取完整的条目详细信息。跳转到光标并显示尾部

matthewh@xen:~$ echo "Cursor example" | systemd-cat
matthewh@xen:~$ journalctl -f
-- Logs begin at Mon 2017-07-03 08:56:12 NZST. --
May 31 17:50:31 xen code.desktop[6771]: [main 17:50:31] update#setState idle
May 31 17:55:01 xen CRON[4468]: pam_unix(cron:session): session opened for user root by (uid=0)
May 31 17:55:01 xen CRON[4469]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
May 31 17:55:01 xen CRON[4468]: pam_unix(cron:session): session closed for user root
May 31 17:55:03 xen smokeping[2839]: RRDs::update ERROR: /var/lib/smokeping/Local/LocalMachine.rrd: illegal attempt to update using time 1527746103 when last update time is 4073847643 (minimum one second step)
May 31 17:55:22 xen cat[4479]: Hello
May 31 17:59:28 xen cat[4539]: Cursor example
May 31 18:00:03 xen smokeping[2839]: RRDs::update ERROR: /var/lib/smokeping/Local/LocalMachine.rrd: illegal attempt to update using time 1527746403 when last update time is 4073847643 (minimum one second step)
May 31 18:00:06 xen cat[4547]: Cursor example
May 31 18:01:09 xen cat[4597]: Cursor example
^C
matthewh@xen:~$ journalctl -f -o json-pretty -n1
{
    "__CURSOR" : "s=b7f2a0f19c9946abab26788729a244c5;i=52a5;b=1ba1d5cabb5840adb02eedc4aba5b4d6;m=2d96b77f94;t=56d7a319ee462;x=8afac4ada39ae1fb",
    "__REALTIME_TIMESTAMP" : "1527746469487714",
    "__MONOTONIC_TIMESTAMP" : "195802136468",
    "_BOOT_ID" : "1ba1d5cabb5840adb02eedc4aba5b4d6",
    "_UID" : "1000",
    "_GID" : "1000",
    "_CAP_EFFECTIVE" : "0",
    "_MACHINE_ID" : "f899a862e4aa4775b8995564d8da565d",
    "_HOSTNAME" : "xen",
    "_TRANSPORT" : "stdout",
    "PRIORITY" : "6",
    "_COMM" : "cat",
    "MESSAGE" : "Cursor example",
    "_STREAM_ID" : "d1fbcc3ff027401e9dc95b5648f9322e",
    "_PID" : "4597"
}
^C
matthewh@xen:~$ journalctl -f --cursor="s=b7f2a0f19c9946abab26788729a244c5;i=52a5;b=1ba1d5cabb5840adb02eedc4aba5b4d6;m=2d96b77f94;t=56d7a319ee462;x=8afac4ada39ae1fb"
-- Logs begin at Mon 2017-07-03 08:56:12 NZST. --
May 31 18:01:09 xen cat[4597]: Cursor example
-- Reboot --
Feb 04 13:03:03 xen systemd-journald[420]: Runtime journal (/run/log/journal/) is 8.0M, max 241.0M, 233.0M free.
Feb 04 13:03:03 xen kernel: Initializing cgroup subsys cpuset
Feb 04 13:03:03 xen kernel: Initializing cgroup subsys cpu
Feb 04 13:03:03 xen kernel: Initializing cgroup subsys cpuacct
Feb 04 13:03:03 xen kernel: Linux version 4.4.0-116-generic (buildd@lgw01-amd64-021) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) ) #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 (Ubuntu 4.4.0-116.140-generic 4.4.98)
Feb 04 13:03:03 xen kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-116-generic root=UUID=f95a581f-2afb-4428-bade-c913f1c51741 ro quiet splash vt.handoff=7
Feb 04 13:03:03 xen kernel: KERNEL supported cpus:
Feb 04 13:03:03 xen kernel:   Intel GenuineIntel
Feb 04 13:03:03 xen kernel:   AMD AuthenticAMD
^C

请注意“--reboot--”文本以及它在过去几天跳回的事实。但在此之前,它通过 systemd-cat 找到了我的条目,所以它被找到了。

我究竟做错了什么?这是我的错误还是疏忽?

奇怪的是,我有一个 CoreOS 服务器,我可以在上面测试它,它的行为不同。它的行为符合预期。两者的 journalctl 版本相同。所有配置都是原封不动的库存标准。

标签: gosystemd

解决方案


推荐阅读