journalctl 日志的可靠导出

gue*_*tli 5 syslog journald journalctl

我寻找一种可靠导出 journalctl 日志的方法。

我可以使用该--since=...选项,但这有点模糊。

在我的情况下,脚本会journalctl --output=json每十分钟调用一次。

我不想错过任何一行,并且(如果可能)我想避免重复行。

问这个问题几天后,我遇到了 RELP:https : //en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol

Mic*_*ton 9

您可以安装 syslog 守护程序,例如 rsyslog(Red Hat 派生系统上的默认设置)。这将以更向后兼容的方式记录所有日志条目,当然您可以根据需要指定自定义日志。

如果不需要实时导出日志,可以journalctl --since像有人说的那样使用。您可以每天在午夜使用时间说明符运行它yesterday以获取准确的 24 小时日志。


如果您真的需要在短时间内获取日志并且不想错过任何一个条目,那么您需要了解cursor。对于每个日志条目 journalctl 将提供一个游标,可用于直接跳到该日志条目 with --cursor,或紧随其后的日志条目 with --after-cursor。考虑以下示例 JSON:

{
    "__CURSOR" : "s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc",
    "__REALTIME_TIMESTAMP" : "1512234682620466",
    "__MONOTONIC_TIMESTAMP" : "304802790693",
    "_BOOT_ID" : "6b134acc25e94d69b4713422b7c773be",
    "PRIORITY" : "6",
    "_MACHINE_ID" : "770056613d554df2abcb7757ba2e6270",
    "_HOSTNAME" : "dalaran.example.us",
    "_PID" : "1",
    "_UID" : "0",
    "_SELINUX_CONTEXT" : "system_u:system_r:init_t:s0",
    "_GID" : "0",
    "_CAP_EFFECTIVE" : "3fffffffff",
    "SYSLOG_FACILITY" : "3",
    "SYSLOG_IDENTIFIER" : "systemd",
    "_TRANSPORT" : "journal",
    "_COMM" : "systemd",
    "_EXE" : "/usr/lib/systemd/systemd",
    "_CMDLINE" : "/usr/lib/systemd/systemd --switched-root --system --deserialize 25",
    "_SYSTEMD_CGROUP" : "/init.scope",
    "_SYSTEMD_UNIT" : "init.scope",
    "_SYSTEMD_SLICE" : "-.slice",
    "CODE_FILE" : "../src/core/unit.c",
    "CODE_LINE" : "1505",
    "CODE_FUNC" : "unit_status_log_starting_stopping_reloading",
    "MESSAGE_ID" : "de5b426a63be47a7b6ac3eaac82e2f6f",
    "MESSAGE" : "Stopping OpenSSH server daemon...",
    "UNIT" : "sshd.service",
    "_SOURCE_REALTIME_TIMESTAMP" : "1512234682615526"
}
Run Code Online (Sandbox Code Playgroud)

出于您的目的,这__CURSOR是一个不透明的 blob。只需捕获您在一次调用中收到的最后一个日志条目的值,journalctl并将其提供给下一次调用:

journalctl --output=json --after-cursor="s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc" ...
Run Code Online (Sandbox Code Playgroud)


小智 1

使用 --since 选项。要获取最近 10 分钟的日志,只需使用:

--since -10m
Run Code Online (Sandbox Code Playgroud)

这将为您提供当前时间前 10 分钟的日志。请参阅手册页https://www.freedesktop.org/software/systemd/man/journalctl.html以及有关 systemd 时间规范的页面https://www.freedesktop.org/software/systemd/man/systemd.time .html#