我寻找一种可靠地导出 journalctl 日志的方法。
我可以使用该--since=...
选项,但这有点模糊。
就我的情况来说,脚本journalctl --output=json
每十分钟调用一次。
我不想错过任何一行,并且(如果可能的话)我想避免重复的行。
问完这个问题几天后,我遇到了RELP:https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol
答案1
您可以安装 syslog 守护程序,例如 rsyslog(Red Hat 衍生系统的默认守护程序)。这将以更向后兼容的方式记录所有日志条目,当然,您可以根据需要指定自定义日志。
如果您不需要实时导出日志,您可以使用journalctl --since
一些人提到的方法。您可以每天午夜使用时间说明符运行它,yesterday
以获取准确的 24 小时日志。
如果你确实需要在短时间间隔内获取日志,并且不想错过任何一条记录,那么你需要了解光标。对于每个日志条目,journalctl 将提供一个游标,可以使用 跳转到该日志条目--cursor
,或使用 跳转到紧随其后的日志条目--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"
}
就您的目的而言,__CURSOR
是一个不透明的斑点。只需从最后的您在一次调用中收到的日志条目journalctl
并将其提供给下一个称呼:
journalctl --output=json --after-cursor="s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc" ...
答案2
使用 --since 选项。要获取过去 10 分钟的日志,只需使用:
--since -10m
这将为您提供当前时间前 10 分钟的日志。请参阅手册页https://www.freedesktop.org/software/systemd/man/journalctl.html以及有关 systemd 时间规范的此页面https://www.freedesktop.org/software/systemd/man/systemd.time.html#
答案3
一种方法(不太可靠,但可行):
$ crontab -l | tail -1
*/10 * * * * journalctl --output=json --since -10m >> journalctl.json
$
另一种方法;(假设您需要将 json 输出导入elasticsearch
):
答案4
您可以使用 using 函数创建用于轮询 journalctl 的 python 脚本query_unique
。作为服务运行可能也会有所帮助,使用重启选项——以免错过任何内容。
https://www.freedesktop.org/software/systemd/python-systemd/journal.html