首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用日志过滤和查看非日记文件?

如何使用日志过滤和查看非日记文件?
EN

Unix & Linux用户
提问于 2022-12-09 02:13:39
回答 1查看 803关注 0票数 2

我正试图搜索数十个没有发送到systemd日志的日志文件,并希望按时间过滤结果,就像journald的-S (从以来)和-U (直到)那样。

  • 选项1:编写一个读取行、分析时间戳、打印过滤输出的程序
  • 选项2: Ubuntu dateutils包中的/usr/bin/dateutils.dgrep
  • 选项3:将日志文件转换为日志格式并使用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-日志远程生成日志文件可以工作:

代码语言:javascript
复制
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确实检测到日志条目是否单调增加:

代码语言:javascript
复制
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访问它都相当容易。

EN

回答 1

Unix & Linux用户

发布于 2023-02-02 07:34:38

选项1-按时间筛选日志文件(跳过日记转换)

我正试图搜索数十个没有发送到systemd日志的日志文件,并希望按时间过滤结果,就像journald的-S (从以来)和-U (直到)那样。

如果只想在特定的日期时间范围内查看syslog样式的日志文件,请尝试super-speedy-syslog-searcher。这使用了super-speedy-syslog-searcher的特性,并跳过了systemd日志服务的使用。

假设您有锈蚀装置,请运行

代码语言:javascript
复制
$ cargo install super_speedy_syslog_searcher

然后在包含日志文件的目录上运行s4

代码语言:javascript
复制
$ s4 /logs

若要限制特定的日期时间范围,请传递-a-b选项以按日期时间进行筛选。使用日期时间过滤的日志文件处理示例

代码语言:javascript
复制
$ 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

选项2-将日志文件转换为日志文件

是否有一个工具可以将syslog样式的日志文件转换为日志文件,以便按时间对条目进行过滤?

概述

转换syslog的操作序列如下:

  1. 使用super-speedy-syslog-searcher以特殊格式的日期时间重新打印日志。
  2. 使用journalctl将每个syslog消息转换为面向行的日刊输出格式中的基本记录器消息。
  3. 使用systemd-journal-remote导入消息

1.使用super-speedy-syslog-searcher重新打印日志文件

给出带有syslog样式消息的日志文件/tmp/logs/syslog.1

代码语言:javascript
复制
<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')为单位)重新打印行。

代码语言:javascript
复制
$ 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 received

2.使用journalctl将syslog消息转换为日志格式消息

下面是使用logger创建最小人工日志格式日志消息的示例:

代码语言:javascript
复制
$ 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

下面是导出到日记导出格式的消息

代码语言:javascript
复制
$ 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=1675414081923606

3.使用systemd-journal-remote导入日记日志消息

若要导入人为消息,请使用systemd-journal-remote将类似的数据重新发送到日志服务。

对于日志消息,每个新的日志条目只需要参数MESSAGE_IDMESSAGE_TRANSPORT__REALTIME_TIMESTAMP_SOURCE_REALTIME_TIMESTAMP。将_TRANSPORT设置为syslog。重写自Unix以来具有日期时间戳的__REALTIME_TIMESTAMP_SOURCE_REALTIME_TIMESTAMP值为微秒。1月1日15:00:36,2023 PST值为1672614036000000。

代码语言:javascript
复制
$ 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

将1.、2.和3.放在一起

将所有这些放在一个简短的shell脚本中,该脚本将处理日志文件目录/tmp/logs/tmp/logsj上的日志文件。

给定syslog样式的日志文件:

代码语言:javascript
复制
$ 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如下所示:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
#!/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/)

审查新的日志文件:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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 received
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/727837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档