49 个版本
0.7.75 | 2024 年 7 月 8 日 |
---|---|
0.7.72 | 2024 年 5 月 30 日 |
0.6.70 | 2024 年 3 月 25 日 |
0.6.68 | 2023 年 7 月 22 日 |
0.1.40 | 2022 年 11 月 23 日 |
#106 in 文件系统
3MB
57K SLoC
超级快速日志搜索器! (s4
)
按日期时间快速搜索和合并日志消息。
超级快速日志搜索器 (s4
) 是一个命令行工具,用于搜索和合并来自不同日志文件的日志消息,按日期时间排序。可以通过日期时间过滤器缩小搜索范围到日期时间范围。
s4
可以读取标准化的日志消息格式,如 RFC 3164 和 RFC 5424 ("syslog")、Red Hat 审计日志、strace 输出,还可以读取许多非标准化的日志消息格式,包括多行日志消息。它还可以解析二进制会计记录 acct、lastlog 和 utmp (acct
、pacct
、lastlog
、utmp
、utmpx
、wtmp
)、systemd 日志 (.journal
) 和 Microsoft 事件日志 (.evtx
)。 s4
可以读取压缩日志(.bz2
、.gz
、.lz4
、.xz
)或存档日志(.tar
)。
s4
旨在非常快速。
使用
安装 super_speedy_syslog_searcher
假设已安装 rust,运行
cargo install --locked super_speedy_syslog_searcher
需要 C 编译器。
分配器 mimalloc
或 jemalloc
默认分配器是系统分配器。
分配器 mimalloc
是功能 mimalloc
,分配器 jemalloc
是功能 jemalloc
。根据 mimalloc
项目基准测试,分配器 mimalloc
是最快的。jemalloc
也很不错。
mimalloc
cargo install --locked super_speedy_syslog_searcher --features mimalloc
在部分 aarch64-unknown-linux-gnu
系统上存在已知的错误 Bus error
。
$ s4 --version
Bus error
要么使用 jemalloc
,要么使用默认的系统分配器。
jemalloc
cargo install --locked super_speedy_syslog_searcher --features jemalloc
以下是使用 jemalloc
或 mimalloc
在各种操作系统上构建 super_speedy_syslog_searcher
的软件包。
Alpine
apk add gcc make musl-dev
Debian 和 Ubuntu
apt install gcc make libc6-dev
或
apt install build-essential
OpenSUSE
zypper install gcc glibc-devel make
Red Hat 和 CentOS
yum install gcc glibc-devel make
Windows 上的 mimalloc
功能
在 Windows 上编译 mimalloc
需要 lib.exe
,它是 Visual Studio Build Tools 的一部分。请参阅 rustup.rs 的说明。
运行 s4
例如,打印 /var/log/
下所有 syslog 文件中的日志消息
s4 /var/log
在 Windows 上,打印 C:\Windows\Logs
下的临时日志
s4.exe C:\Windows\Logs
在 Windows 上,使用 Powershell 打印 C:\Windows
下所有 .log
文件
Get-ChildItem -Filter '*.log' -File -Path "C:\Windows" -Recurse -ErrorAction SilentlyContinue `
| Select-Object -ExpandProperty FullName `
| s4.exe -
(注意:UTF-16 编码的日志无法解析,见 问题 #16)
(注意:打开太多文件会导致错误 too many files open,见 问题 #270,因此 Get-ChildItem -Filter
通过减少 s4.exe
打开的文件数量来减轻)
在 Windows 上,打印 Windows 事件日志
s4.exe C:\Windows\System32\winevt\Logs
打印 2022年1月1日 00:00:00 之后的日志消息
s4 /var/log -a 20220101
打印 2022年1月1日 00:00:00 至 2022年1月2日的日志消息
s4 /var/log -a 20220101 -b 20220102
或
s4 /var/log -a 20220101 -b @+1d
打印 2022年1月1日 12:00:00 至 16:00:00 的日志消息
s4 /var/log -a 20220101T120000 -b 20220101T160000
打印最多一天前的记录日志消息(借助 find
)
find /var -xdev -type f \( \
-name 'lastlog' \
-or -name 'wtmp' \
-or -name 'wtmpx' \
-or -name 'utmp' \
-or -name 'utmpx' \
-or -name 'acct' \
-or -name 'pacct' \
\) \
2>/dev/null \
| s4 - -a=-1d
打印最多一小时前的 journal 日志消息,并在前面加上 journal 文件名(借助 find
)
find / -xdev -name '*.journal' -type f 2>/dev/null \
| s4 - -a=-1h -n
只打印最多两天前发生的日志消息(借助 GNU date
)
s4 /var/log -a $(date -d "2 days ago" '+%Y%m%d') -b @+1d
只打印最多两天前中午发生的日志消息(借助 GNU date
)
s4 /var/log -a $(date -d "2 days ago 12" '+%Y%m%dT%H%M%S') -b @+1h
只打印最多两天前在印度班加罗尔(时区偏移 +05:30)中午发生的日志消息,并在前面加上等效的 UTC 日期时间(借助 GNU date
)
s4 /var/log -u -a $(date -d "2 days ago 12" '+%Y%m%dT%H%M%S+05:30') -b @+1h
--帮助
Speedily search and merge log messages by datetime.
DateTime filters may be passed to narrow the search.
s4 aims to be very fast.
Usage: s4 [OPTIONS] <PATHS>...
Arguments:
<PATHS>... Path(s) of log files or directories.
Directories will be recursed. Symlinks will be followed.
Paths may also be passed via STDIN, one per line. The user must
supply argument "-" to signify PATHS are available from STDIN.
Options:
-a, --dt-after <DT_AFTER>
DateTime Filter After: print log messages with a datetime that is at
or after this datetime. For example, "20200102T120000" or "-5d".
-b, --dt-before <DT_BEFORE>
DateTime Filter Before: print log messages with a datetime that is at
or before this datetime.
For example, "2020-01-03T23:00:00.321-05:30" or "@+1d+11h"
-t, --tz-offset <TZ_OFFSET>
Default timezone offset for datetimes without a timezone.
For example, log message "[20200102T120000] Starting service" has a
datetime substring "20200102T120000".
That datetime substring does not have a timezone offset
so this TZ_OFFSET value would be used.
Example values, "+12", "-0800", "+02:00", or "EDT".
To pass a value with leading "-" use "=" notation, e.g. "-t=-0800".
If not passed then the local system timezone offset is used.
[default: -07:00]
-z, --prepend-tz <PREPEND_TZ>
Prepend a DateTime in the timezone PREPEND_TZ for every line.
Used in PREPEND_DT_FORMAT.
-u, --prepend-utc
Prepend a DateTime in the UTC timezone offset for every line.
This is the same as "--prepend-tz Z".
Used in PREPEND_DT_FORMAT.
-l, --prepend-local
Prepend DateTime in the local system timezone offset for every line.
This is the same as "--prepend-tz +XX" where +XX is the local system
timezone offset.
Used in PREPEND_DT_FORMAT.
-d, --prepend-dt-format <PREPEND_DT_FORMAT>
Prepend a DateTime using the strftime format string.
If PREPEND_TZ is set then that value is used for any timezone offsets,
i.e. strftime "%z" "%:z" "%Z" values, otherwise the timezone offset value
is the local system timezone offset.
[Default: %Y%m%dT%H%M%S%.3f%z]
-n, --prepend-filename
Prepend file basename to every line.
-p, --prepend-filepath
Prepend file full path to every line.
-w, --prepend-file-align
Align column widths of prepended data.
--prepend-separator <PREPEND_SEPARATOR>
Separator string for prepended data.
[default: :]
--separator <LOG_MESSAGE_SEPARATOR>
An extra separator string between printed log messages.
Per log message not per line of text.
Accepts a basic set of backslash escape sequences,
e.g. "\0" for the null character, "\t" for tab, etc.
--journal-output <JOURNAL_OUTPUT>
The format for .journal file log messages.
Matches journalctl --output options.
[default: short]
[possible values: short, short-precise, short-iso, short-iso-precise,
short-full, short-monotonic, short-unix, verbose, export, cat]
-c, --color <COLOR_CHOICE>
Choose to print to terminal using colors.
[default: auto]
[possible values: always, auto, never]
--blocksz <BLOCKSZ>
Read blocks of this size in bytes.
May pass value as any radix (hexadecimal, decimal, octal, binary).
Using the default value is recommended.
Most useful for developers.
[default: 65536]
-s, --summary
Print a summary of files processed to stderr.
Most useful for developers.
-h, --help
Print help
-V, --version
Print version
Given a file path, the file format will be processed based on a best guess of
the file name.
If the file format is not guessed then it will be treated as a UTF8 text file.
Given a directory path, found file names that have well-known non-log file name
extensions will be skipped.
DateTime Filters may be strftime specifier patterns:
"%Y%m%dT%H%M%S*"
"%Y-%m-%d %H:%M:%S*"
"%Y-%m-%dT%H:%M:%S*"
"%Y/%m/%d %H:%M:%S*"
"%Y%m%d"
"%Y-%m-%d"
"%Y/%m/%d"
"+%s"
Each * is an optional trailing 3-digit fractional sub-seconds,
or 6-digit fractional sub-seconds, and/or timezone.
Pattern "+%s" is Unix epoch timestamp in seconds with a preceding "+".
For example, value "+946684800" is be January 1, 2000 at 00:00, GMT.
DateTime Filters may be custom relative offset patterns:
"+DwDdDhDmDs" or "-DwDdDhDmDs"
"@+DwDdDhDmDs" or "@-DwDdDhDmDs"
Custom relative offset pattern "+DwDdDhDmDs" and "-DwDdDhDmDs" is the offset
from now (program start time) where "D" is a decimal number.
Each lowercase identifier is an offset duration:
"w" is weeks, "d" is days, "h" is hours, "m" is minutes, "s" is seconds.
For example, value "-1w22h" is one week and twenty-two hours in the past.
Value "+30s" is thirty seconds in the future.
Custom relative offset pattern "@+DwDdDhDmDs" and "@-DwDdDhDmDs" is relative
offset from the other datetime.
Arguments "-a 20220102 -b @+1d" are equivalent to "-a 20220102 -b 20220103".
Arguments "-a @-6h -b 20220101T120000" are equivalent to
"-a 20220101T060000 -b 20220101T120000".
Without a timezone, the Datetime Filter is presumed to be the local
system timezone.
Command-line passed timezones may be numeric timezone offsets,
e.g. "+09:00", "+0900", or "+09", or named timezone offsets, e.g. "JST".
Ambiguous named timezones will be rejected, e.g. "SST".
--prepend-tz and --dt-offset function independently:
--dt-offset is used to interpret processed log message datetime stamps that
do not have a timezone offset.
--prepend-tz affects what is pre-printed before each printed log message line.
--separator accepts backslash escape sequences:
"\0", "\a", "\b", "\e", "\f", "\n", "\r", "\\", "\t", "\v"
Resolved values of "--dt-after" and "--dt-before" can be reviewed in
the "--summary" output.
s4 uses file naming to determine the file type.
s4 can process files compressed and named .bz2, .gz, .lz4, .xz, and files
archived within a .tar file.
Log messages from different files with the same datetime are printed in order
of the arguments from the command-line.
Datetimes printed for .journal file log messages may differ from datetimes
printed by program journalctl.
See Issue #101
DateTime strftime specifiers are described at
https://docs.rs/chrono/latest/chrono/format/strftime/
DateTimes supported are only of the Gregorian calendar.
DateTimes supported language is English.
Further background and examples are at the project website:
https://github.com/jtmoon79/super-speedy-syslog-searcher/
Is s4 failing to parse a log file? Report an Issue at
https://github.com/jtmoon79/super-speedy-syslog-searcher/issues/new/choose
关于
为什么 s4
?
超级快速Syslog搜索器 (s4
)旨在帮助工程师以时间顺序审查各种日志文件。主要用途是协助调查已知问题发生时间且日志文件众多,但其他来源证据较少的情况。
目前,日志文件格式差异很大。大多数日志都是临时格式。即使是同一系统上为同一服务创建的单独日志文件,也可能有不同的消息格式!按时间顺序对这些日志消息进行排序可能非常困难。结果是工程师可能不得不在众多日志文件中“寻找和点击”,寻找某些时间附近的故障线索;真是一件繁琐的事情!
这就是超级快速Syslog搜索器 🦸 ‼
s4
将以时间顺序打印多个日志文件中的日志消息。可以传递一个时间范围“窗口”,以限制打印消息的时期。这有助于工程师,例如,需要查看两天前12:00到12:05之间在多个系统日志文件中发生的所有日志消息。
创建超级快速Syslog搜索器的间接动机是主要开发者想找借口学习rust 🦀,并想为一些软件测试工程师的反复需求创建一个开源工具 😄
下面是现实世界示例的理由,请参阅日志混乱:s4解决的问题部分。
功能
- 解析
- 使用正式的日期时间格式解析临时日志消息
- 互联网消息格式(RFC 2822)
例如,Wed, 1 Jan 2020 22:00:00 PST message… - BSD Syslog 协议(RFC 3164)
例如,<8>Jan 1 22:00:00 message… - 互联网上的日期和时间:时间戳(RFC 3339)
例如,2020-01-01T22:00:00-08:00 message… - Syslog 协议(RFC 5424)
例如,2020-01-01T22:00:00-08:00 message… - ISO 8601
例如,2020-01-01T22:00:00-08:00 message…,20200101T220000-0800 message…等。 [1]
- 互联网消息格式(RFC 2822)
- Red Hat 审计日志文件
- strace输出文件,带有选项
-ttt
或--timestamps
,即Unix纪元加上可选的毫秒、微秒或纳秒 - 来自多个操作系统和CPU架构的二进制用户会计记录文件(
acct
,pacct
,lastlog
,utmp
,utmpx
) - 二进制Windows事件日志文件
- 与
journalctl
选项匹配的二进制systemd日志文件 - 许多具有临时日期时间格式的各种文本日志消息
- 多行日志消息
- 使用正式的日期时间格式解析临时日志消息
- 检查
.tar
存档文件,以解析可解析的日志文件 [2] - 可以处理包含日志文件的
.bz2
,.gz
,.lz4
或.xz
。 - 针对来自不同来源的“野外”日志文件进行了测试(请参阅项目路径
./logs/
) - 添加日期时间和文件路径,以便于程序化解析或可视化遍历不同的日志消息
- 速度与GNU
grep
和sort
相当 - 处理无效的UTF-8
- 接受任意大小的文件 参见 技巧
文件名猜测
给定一个文件路径,s4
将尝试解析它。文件类型必须在名称中。对于非标准名称的文件进行猜测。
例如,标准文件名 utmp
将始终被处理为 utmp
记录文件。但非标准名称 log.utmp.1
被猜测为 utmp
记录文件。类似的猜测也应用于 lastlog
、wtmp
、acct
、pacct
、journal
和 evtx
文件。当与压缩或归档文件扩展名结合使用时,例如 .bz2
、.gz
、.lz4
或 .xz
,则 s4
尝试根据名称猜测压缩或归档类型以及归档内的文件。例如,user.journal.gz
被猜测为gzip压缩文件中的systemd日志文件。然而,如果该文件名称不寻常,例如 user.systemd-journal.gz
,则它被猜测为gzip压缩文件中的文本日志文件。
当无法猜测文件类型时,它将被视为UTF8文本日志文件。例如,文件名仅为 unknown
的文件没有明显的类型,因此它将尝试解析为UTF8 ad-hoc文本日志文件。
tar
文件将检查可解析的文件。[2]
目录遍历
给定一个目录路径,s4
将遍历目录及其所有子目录,并跟随符号链接和跨文件系统路径。 s4
将忽略已知为非日志文件的扩展名的文件。例如,具有扩展名 .dll
、.mp3
、.png
或 .so
的文件不太可能是日志文件,因此不会被处理。
因此,给定一个文件 /tmp/file.mp3
,对 s4 /tmp
的调用将不会尝试处理 file.mp3
。对 s4 /tmp/file.mp3
的调用将尝试处理 file.mp3
。它将被视为UTF8文本日志文件。
限制
- 仅处理UTF-8或ASCII编码的syslog文件。(问题 #16)
- 无法处理多文件
.gz
文件(仅处理找到的第一个流)。(问题 #8) - 无法处理多文件
.xz
文件(仅处理找到的第一个流)。(《问题 #11》Issue #11) - 无法处理
.zip
归档文件(《问题 #39》Issue #39) - [1] ISO 8601
- [2] 无法处理存档文件或存档文件或压缩文件内的压缩文件(《问题 #14》Issue #14)
例如,无法处理logs.tar.xz
,也无法处理logs.tar
中的文件log.gz
技巧
- 在处理之前,一次性读取整个
.bz2
文件(《问题 #300》Issue #300) - 在处理之前,一次性读取整个
.lz4
文件(《问题 #293》Issue #293) - 在打印之前,一次性将整个
.xz
文件读入内存(《问题 #12》Issue #12) - 在打印之前,一次性将整个
.evtx
文件读入内存(《问题 #86》Issue #86) - 在打印之前,一次性将
.tar
文件内的整个文件读入内存(《问题 #13》Issue #13) - 在打印之前,一次性将整个用户会计记录文件读入内存
- 压缩的
.journal
和.evtx
文件提取到临时文件(《问题 #284》Issue #284)
更多
比较
包括 GNU 工具在内的不同日志合并器的功能概述。
- 将 GNU
grep
通过管道传输到 GNUsort
- 超级快速系统日志搜索器;
s4
- logmerger;
logmerger
- Toolong;
tl
- logdissect;
logdissect.py
符号 | |
---|---|
✔ | 是 |
⬤ | 大多数 |
◒ | 一些 |
✗ | 否 |
☐ | 附带的GNU程序 |
! | 用户输入 |
‼ | 复杂用户输入 |
通用功能
程序 | 源代码 | 命令行界面 | 文本用户界面 | 交互式 | 实时跟踪 | 合并不同的日志格式 | 日期时间搜索范围 |
---|---|---|---|---|---|---|---|
grep|排序 |
C | ✔ | ✗ | ✗ | ☐ tail |
✗ | ‼ |
s4 |
Rust | ✔ | ✗ | ✗ | ✗ | ✔ | ✔ |
logmerger |
Python | ✔ | ✔ | ✔ | ✗ | ‼ | ✔ |
tl |
Python | ✔ | ✔ | ✔ | ✔ | ✗ | ✗ |
logdissect.py |
Python | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ |
支持的正式日志日期时间
程序 | RFC 2822 | RFC 3164 | RFC 3339 | RFC 5424 | ISO 8601 |
---|---|---|---|---|---|
grep|排序 |
✗ | ‼ | ! | ! | ! |
s4 |
✔ | ✔ | ✔ | ✔ | ✔ |
logmerger |
✗ | ✗ | ! | ! | ◒ |
tl |
✗ | ✗ | ✔ | ✔ | ✔ |
支持的其它日志或文件格式
程序 | 临时文本格式 | Red Hat 审计日志 | 日志 | acct/lastlog/utmp |
.evtx |
.pcap/.pcapng |
.jsonl |
strace |
---|---|---|---|---|---|---|---|---|
grep|排序 |
‼ | ! | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ |
s4 |
✔ | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ |
logmerger |
‼ | ‼ | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ |
tl |
✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ |
支持的归档格式
程序 | .gz |
.lz4 |
.bz |
.bz2 |
.xz |
.tar |
.zip |
---|---|---|---|---|---|---|---|
grep|排序 |
☐ zgrep |
☐ lz4 |
☐ bzip |
☐ bzip2 |
☐ xz |
✗ | ✗ |
s4 |
✔ | ✔ | ✗ | ✔ | ✔ | ✔ | ✗ |
logmerger |
✔ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
tl |
✔ | ✗ | ✔ | ✔ | ✗ | ✗ | ✗ |
logdissect.py |
✔ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
速度比较
在WSL2上Ubuntu 22运行的三种大型日志文件合并的比较。
- 2000行日志文件,1116357字节(≈1.1 MB),包含高平面Unicode
- 2500行日志文件,1078842字节(≈1.0 MB),包含高平面Unicode
- 5000行日志文件,2158138字节(≈2.1 MB),包含高平面Unicode
使用hyperfine
和GNU time
测量最大常驻集大小。
命令 | 平均[ms] | 最小[ms] | 最大[ms] | 相对 | 最大常驻集大小[KB] |
---|---|---|---|---|---|
grep+排序 |
41.0 ± 0.5 | 40.5 | 43.8 | 1.00 | 2740 |
s4(系统) |
37.3 ± 1.5 | 35.3 | 44.6 | 1.00 | 48084 |
s4(mimalloc) |
30.3 ± 1.8 | 27.1 | 36.6 | 1.00 | 77020 |
s4(jemalloc) |
36.0 ± 2.0 | 32.5 | 43.2 | 1.00 | 69028 |
logmerger |
720.2 ± 4.9 | 712.9 | 728.0 | 1.00 | 56332 |
测试程序
- GNU
grep
3.7,GNUsort
8.32 s4
0.7.75logmerger
0.9.0在Python 3.10.12上tl
1.5.0在Python 3.10.12上hyperfine
1.11.0- GNU
time
1.9
请参阅compare-log-mergers.txt
中的结果目录。
基准测试
函数slice_contains_X_2_unroll
是slice.contains
的定制实现。它用于字符串搜索,并专门用于绕过不必要的正则表达式匹配。根据此火焰图,正则表达式匹配非常昂贵。
根据此标准基准报告,slice_contains_X_2_unroll
在某些情况下与memchr
和stringzilla
表现相当。
本地构建
请参阅安装super_speedy_syslog_searcher
部分。
解析 .journal
文件
要使用libsystemd.so
在运行时,需要安装libsystemd
。
请求支持日期时间格式;您的特定日志文件
如果您找到了Super Speedy Syslog Searcher无法解析的日志文件,您可以创建一个新问题类型功能请求(日期时间格式)。
这里是一个用户提交的示例问题。
"syslog" 以及其他项目定义
syslog
在这个项目中,“syslog”这个术语被广泛用来指代任何日志文本第一行包含时间戳的日志消息。
技术上,“syslog”是在多个RFC文档中定义的,规定了字段、格式、长度和其他技术限制。在这个项目中,“syslog”与“log”是互换使用的。
“sysline”这个术语指的是一个可能包含多个文本行的单个日志消息。
有关更多项目定义,请参阅数据定义部分。
日志消息
“日志消息”是指任何类型日志方案的单个日志条目;utmpx文件中的一个条目,systemd日志中的一个条目,Windows事件日志中的一个条目,一个正式的RFC 5424 syslog消息,或一个临时日志消息。
日志混乱:问题 s4
解决方案
实际上,大多数日志文件格式都是临时的。在正式定义的日志格式中,有许多变化。结果是,通过时间戳合并不同的日志消息是非常繁琐的。如果一个工程师正在调查多个日志文件中具有症状的问题,那么工程师必须在那些许多日志文件中进行“逐行搜索”。无法将日志文件合并以获得一个连贯的视图。
以下真实世界的示例日志文件可以在项目目录./logs
中找到。
开源软件示例
nginx 网络服务器
例如,开源nginx网络服务器在文件access.log
中以临时格式记录访问尝试,该文件记录了访问尝试。
192.168.0.115 - - [08/Oct/2022:22:26:35 +0000] "GET /DOES-NOT-EXIST HTTP/1.1" 404 0 "-" "curl/7.76.1" "-"
这与其他nginx日志文件(如error.log
)的日志格式完全不同。
2022/10/08 22:26:35 [error] 6068#6068: *3 open() "/usr/share/nginx/html/DOES-NOT-EXIST" failed (2: No such file or directory), client: 192.168.0.115, server: _, request: "GET /DOES-NOT-EXIST HTTP/1.0", host: "192.168.0.100"
nginx正遵循由apache网络服务器设定的坏例子。
Debian 11
以下是从Debian 11主机中提取的日志片段。
文件/var/log/alternatives.log
update-alternatives 2022-10-10 23:59:47: run with --quiet --remove rcp /usr/bin/ssh
文件/var/log/dpkg.log
2022-10-10 15:15:02 upgrade gpgv:amd64 2.2.27-2 2.2.27-2+deb11u1
文件/var/log/kern.log
Oct 10 23:07:16 debian11-b kernel: [ 0.10034] Linux version 5.10.0-11-amd64
文件/var/log/unattended-upgrades/unattended-upgrades-shutdown.log
2022-10-10 23:07:16,775 WARNING - Unable to monitor PrepareForShutdown() signal, polling instead.
二进制文件
然后还有二进制文件,例如Linux和其他Unix操作系统的wtmp
文件。使用工具utmpdump
,将utmp
记录结构转换为文本
[7] [12103] [ts/0] [user] [pts/0] [172.1.2.1] [172.1.2.2] [2023-03-05T23:12:36,270185+00:00]
并从systemd的.journal
文件中读取,使用journalctl
Mar 03 10:26:10 host systemd[1]: Started OpenBSD Secure Shell server.
░░ Subject: A start job for unit ssh.service has finished successfully
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░
░░ A start job for unit ssh.service has finished successfully.
░░
░░ The job identifier is 120.
Mar 03 10:31:23 host sshd[4559]: Accepted login for user1 from 172.1.2.1 port 51730 ssh2
尝试使用GNU的grep
、sort
、sed
或awk
按时间戳合并这两个日志消息!
此外,如果wtmp
文件来自不同的架构或操作系统,则二进制记录结构可能无法由本地utmpdump
工具解析。那么怎么办呢?
商业软件示例
商业软件和计算机硬件供应商几乎总是使用临时的日志消息格式,该格式在每个系统上的日志文件中甚至更加不可预测。
Synology DiskStation
以下是从Synology DiskStation主机中提取的日志片段。
文件DownloadStation.log
2019/06/23 21:13:34 (system) trigger DownloadStation 3.8.13-3519 Begin start-stop-status start
文件sfdisk.log
2019-04-06T01:07:40-07:00 dsnet sfdisk: Device /dev/sdq change partition.
文件synobackup.log
info 2018/02/24 02:30:04 SYSTEM: [Local][Backup Task Backup1] Backup task started.
是的,那些是制表符字符
Mac OS 12
以下是从Mac OS 12.6主机中提取的日志片段。
文件/var/log/system
Oct 11 15:04:55 localhost syslogd[110]: Configuration Notice:
ASL Module "com.apple.cdscheduler" claims selected messages.
Those messages may not appear in standard system log files or in the ASL database.
文件/var/log/wifi
Thu Sep 21 23:05:35.850 Usb Host Notification NOT activated
文件/var/log/fsck_hs.log
/dev/rdisk2s2: fsck_hfs started at Thu Sep 21 21:31:05 2023
QUICKCHECK ONLY; FILESYSTEM CLEAN
文件/var/log/anka.log
Fri Sep 22 00:06:05 UTC 2023: Checking /Library/Developer/CoreSimulator/Volumes/watchOS_20S75...
文件 /var/log/displaypolicyd.log
2023-09-15 04:26:56.330256-0700: Started at Fri Sep 15 04:26:56 2023
文件 /var/log/com.apple.xpc.launchd/launchd.log.1
2023-10-26 16:56:23.287770 <Notice>: swap enabled
文件 /var/log/asl/logs/aslmanager.20231026T170200+00
Oct 26 17:02:00: aslmanager starting
你是否也注意到了日志文件名称以意想不到的方式有所不同?
Microsoft Windows 10
以下是来自Windows 10主机的日志片段。
文件 ${env:SystemRoot}\debug\mrt.log
Microsoft Windows Malicious Software Removal Tool v5.83, (build 5.83.13532.1)
Started On Thu Sep 10 10:08:35 2020
文件 ${env:SystemRoot}\comsetup.log
COM+[12:24:34]: ********************************************************************************
COM+[12:24:34]: Setup started - [DATE:05,27,2020 TIME: 12:24 pm]
文件 ${env:SystemRoot}\DirectX.log
11/01/19 20:03:40: infinst: Installed file C:\WINDOWS\system32\xactengine2_1.dll
文件 ${env:SystemRoot}/Microsoft.NET/Framework/v4.0.30319/ngen.log
09/15/2022 14:13:22.951 [515]: 1>Warning: System.IO.FileNotFoundException: Could not load file or assembly
文件 ${env:SystemRoot}/Performance/WinSAT/winsat.log
68902359 (21103) - exe\logging.cpp:0841: --- START 2022\5\17 14:26:09 PM ---
68902359 (21103) - exe\main.cpp:4363: WinSAT registry node is created or present
是的,它读取了小时 14
PM
…
总结
这种混乱的日志记录方法在商业和开源软件中很典型,这真是一团糟!尝试通过自然排序机制合并日志消息,按时间戳排序是困难甚至不可能的。
因此,需要超级快速系统日志搜索器!🦸 s4
将不同的日志文件合并为一个按时间排序的连贯日志。
进一步阅读
星标
Dependencies
~25–38MB
~667K SLoC