我正试图搜索数十个没有发送到systemd日志的日志文件,并希望按时间过滤结果,就像journald的-S (从以来)和-U (直到)那样。
journalctl --root $dir -S xxx -U yyy我从第一开始,意识到我正在重新发明轮子,试着第二次尝试,发现它非常慢,然后看了第三,主要是因为它速度快,抛光,并且有很多“眼球”(特别是“付费眼球”)在观察它。
那么,是否有一个工具可以将syslog风格的日志文件转换为日志文件,以便根据时间对条目进行过滤?Systemd-cat将无法工作,因为它不允许伪造时间戳:生成的日志文件将显示几乎同时发生的所有事情。
有什么建议吗?
谢谢!
编辑:
日志文件>100 me,其中有将近100个,时间戳是简单的syslog风格的"MMM DD HH:MM:SS",我只想说“显示这两次之间的日志条目”。
选项1是“编写一个程序来完成它”,但是我确信这个轮子已经被改造过很多次了,我会觉得在堆中再增加一个(平庸的)轮子是愚蠢的。
选项2在半小时后放弃之前还没有完成一个文件。本质上,我想要一个可以重用的快速通用解决方案,journalctl看起来是答案的一个很好的部分。
我认为journalctl利用了日志文件单调增加的时间戳,并使用二进制搜索在给定的时间范围内查找记录。dateutils.dgrep (dategrep)计划不允许做出这样的假设,这使得它在一月份比糖蜜慢。
Edit2:
它看起来像是编写一个简短的脚本来解析输入日志,以日志导出格式发出记录,并使用systemd-日志远程生成日志文件可以工作:
journalctl -n 10 -o export > journal.txt
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
journalctl --file=test.journal -S "yyyy-mm-dd hh:mm:ss" -U "yyyy-mm-dd hh:mm:ss"
(log entries for time range shown)
journalctl --verify --file=test.journal
PASS: test.journal 最初我认为__CURSOR行可能包含密封校验和,但是删除它们没有明显的效果。在Ubuntu 20.04上,默认情况下不启用前向安全密封,但journalctl确实检测到日志条目是否单调增加:
rm -f test.journal
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
journalctl --verify --file=test.journal
3947a0: Entry timestamp out of synchronization
File corruption detected at test.journal:3947a0 (of 8388608 bytes, 44%).
FAIL: test.journal (Bad message)似乎将任何任意日志文件导入日志格式并使用journalctl访问它都相当容易。
发布于 2023-02-02 07:34:38
我正试图搜索数十个没有发送到systemd日志的日志文件,并希望按时间过滤结果,就像journald的-S (从以来)和-U (直到)那样。
如果只想在特定的日期时间范围内查看syslog样式的日志文件,请尝试super-speedy-syslog-searcher。这使用了super-speedy-syslog-searcher的特性,并跳过了systemd日志服务的使用。
假设您有锈蚀装置,请运行
$ cargo install super_speedy_syslog_searcher然后在包含日志文件的目录上运行s4。
$ s4 /logs若要限制特定的日期时间范围,请传递-a和-b选项以按日期时间进行筛选。使用日期时间过滤的日志文件处理示例
$ cat /tmp/logs/kernel.log
<6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
$ cat /tmp/logs/syslog.1
<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received
$ s4 -a "2023-01-02T00:00:00Z" -b "2023-01-03T00:00:00Z" /tmp/logs/
<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888是否有一个工具可以将syslog样式的日志文件转换为日志文件,以便按时间对条目进行过滤?
转换syslog的操作序列如下:
super-speedy-syslog-searcher以特殊格式的日期时间重新打印日志。journalctl将每个syslog消息转换为面向行的日刊输出格式中的基本记录器消息。systemd-journal-remote导入消息super-speedy-syslog-searcher重新打印日志文件给出带有syslog样式消息的日志文件/tmp/logs/syslog.1。
<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received使用super-speedy-syslog-searcher (s4),在UTC时区(-u)中,以文件名(-n)和引导日期时间( Unix,以微秒(-d '%s000000')为单位)重新打印行。
$ s4 -n -u -d '%s000000' /tmp/logs/syslog.1
syslog.1:1672610305000000:<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
syslog.1:1672786836000000:<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect receivedjournalctl将syslog消息转换为日志格式消息下面是使用logger创建最小人工日志格式日志消息的示例:
$ echo "SYSLOG_IDENTIFIER=logger
MESSAGE=one journal logger message
MESSAGE_ID=$(uuidgen)" | logger --journald -s
$ journalctl -n1 -t logger
Feb 03 00:48:01 HOST logger[445736]: one journal logger message下面是导出到日记导出格式的消息
$ journalctl -n1 --identifier=logger --output=export
__CURSOR=s=4a35367b4dd3403b948f1a5ff2fb3515;i=474833;b=5285cccfe2f9481ca12589f5511b8c57;m=dd9ee>
__REALTIME_TIMESTAMP=1675414081923660
__MONOTONIC_TIMESTAMP=951851827460
_BOOT_ID=5286cccfe2f9481ca1ea8cf5221b8c5e
_UID=0
_GID=0
_MACHINE_ID=333fa82c526bba518cdc8c2262e6d480
_HOSTNAME=HOST
_TRANSPORT=journal
SYSLOG_IDENTIFIER=logger
MESSAGE=one journal logger message
MESSAGE_ID=4ebd2168-30bf-4258-bf0f-54b5811674e1
_PID=445736
_COMM=logger
_SOURCE_REALTIME_TIMESTAMP=1675414081923606systemd-journal-remote导入日记日志消息若要导入人为消息,请使用systemd-journal-remote将类似的数据重新发送到日志服务。
对于日志消息,每个新的日志条目只需要参数MESSAGE_ID、MESSAGE、_TRANSPORT、__REALTIME_TIMESTAMP、_SOURCE_REALTIME_TIMESTAMP。将_TRANSPORT设置为syslog。重写自Unix以来具有日期时间戳的__REALTIME_TIMESTAMP和_SOURCE_REALTIME_TIMESTAMP值为微秒。1月1日15:00:36,2023 PST值为1672614036000000。
$ echo "\
__REALTIME_TIMESTAMP=1672614036000000
_TRANSPORT=syslog
MESSAGE_ID=4ebd2168-30bf-4258-bf0f-54b5811674e1
MESSAGE=one journal logger message
SYSLOG_IDENTIFIER=logger
_SOURCE_REALTIME_TIMESTAMP=1672614036000000
" | /usr/lib/systemd/systemd-journal-remote --output=/tmp/tmp.journal -
$ journalctl --output=short-full --file=/tmp/tmp.journal
Sun 2023-01-01 15:00:36 PST logger: one journal logger message将所有这些放在一个简短的shell脚本中,该脚本将处理日志文件目录/tmp/logs到/tmp/logsj上的日志文件。
给定syslog样式的日志文件:
$ cat /tmp/logs/kernel.log
<6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
$ cat /tmp/logs/syslog.1
<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received使用kernel.log重印文件s4如下所示:
$ s4 --color=never -n -u -d '%s000000' /tmp/logs/kernel.log | tail -n1
kernel.log:1672689660000000:<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888注意,前面的字段是由:分隔的(默认)。
将/tmp/logs下的每个syslog样式的日志文件处理为路径/tmp/logsj下的相应日志文件。这将SYSLOG_IDENTIFIER设置为文件名,不包括文件扩展名。创建的日志文件是源文件的名称加上.journal。
#!/usr/bin/env bash
mkdir /tmp/logsj
while read line; do
echo "line is '${line}'"
name=$(echo -n "${line}" | cut -f1 -d:)
ts=$(echo -n "${line}" | cut -f2 -d:)
mesg=$(echo -n "${line}" | cut -f3- -d:)
jmesg="\
__REALTIME_TIMESTAMP=${ts}
_TRANSPORT=syslog
MESSAGE_ID=$(uuidgen)
MESSAGE=${mesg}
SYSLOG_TIMESTAMP=${ts}
SYSLOG_IDENTIFIER=${name%%.*}
_SOURCE_REALTIME_TIMESTAMP=${ts}
"
echo "${jmesg}" | /usr/lib/systemd/systemd-journal-remote "--output=/tmp/logsj/${name}.journal" -
done <<< $(s4 --color=never -n -u -d '%s000000' /tmp/logs/)审查新的日志文件:
$ ls -l /tmp/logsj/
-rw-r----- 1 root root 8388608 Feb 3 14:36 kernel.log.journal
-rw-r----- 1 root root 8388608 Feb 3 14:36 syslog.1.journal
$ PAGER= journalctl --utc --output=short-full --directory=/tmp/logsj/
Sun 2023-01-01 21:58:25 UTC kernel: <6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
Sun 2023-01-01 21:58:25 UTC syslog: <29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
Mon 2023-01-02 20:01:00 UTC kernel: <6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
Tue 2023-01-03 23:00:36 UTC syslog: <86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received在日期时间片上运行journalctl
$ PAGER= journalctl --utc --output=short-full --until "2023-01-01 23:00:00 UTC" --directory=/tmp
/logsj/
Sun 2023-01-01 21:58:25 UTC kernel: <6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
Sun 2023-01-01 21:58:25 UTC syslog: <29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
$ PAGER= journalctl --utc --output=short-full --since "2023-01-01 23:00:00 UTC" --directory=/tmp
/logsj/
Mon 2023-01-02 20:01:00 UTC kernel: <6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
Tue 2023-01-03 23:00:36 UTC syslog: <86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect receivedhttps://unix.stackexchange.com/questions/727837
复制相似问题