#log #log-file #file-path #read-file #syslog #logging #log-format

bin+lib super_speedy_syslog_searcher

按日期时间快速搜索和合并日志消息。可以通过日期时间过滤器来缩小搜索范围。s4旨在非常快速。

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 文件系统

MIT 许可证

3MB
57K SLoC

超级快速日志搜索器! (s4)

按日期时间快速搜索和合并日志消息。

MSRV License docs.rs

crates.io version crates.io downloads crates.io downloads (version) CHANGELOG lib.rs

Build status coveralls.io Commits since

超级快速日志搜索器 (s4) 是一个命令行工具,用于搜索和合并来自不同日志文件的日志消息,按日期时间排序。可以通过日期时间过滤器缩小搜索范围到日期时间范围。

s4 可以读取标准化的日志消息格式,如 RFC 3164 和 RFC 5424 ("syslog")、Red Hat 审计日志、strace 输出,还可以读取许多非标准化的日志消息格式,包括多行日志消息。它还可以解析二进制会计记录 acct、lastlog 和 utmp (acctpacctlastlogutmputmpxwtmp)、systemd 日志 (.journal) 和 Microsoft 事件日志 (.evtx)。 s4 可以读取压缩日志(.bz2.gz.lz4.xz)或存档日志(.tar)。

s4 旨在非常快速。



使用

安装 super_speedy_syslog_searcher

假设已安装 rust,运行

cargo install --locked super_speedy_syslog_searcher

需要 C 编译器。

分配器 mimallocjemalloc

默认分配器是系统分配器。

分配器 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


以下是使用 jemallocmimalloc 在各种操作系统上构建 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解决的问题部分。

功能

文件名猜测

给定一个文件路径,s4 将尝试解析它。文件类型必须在名称中。对于非标准名称的文件进行猜测。

例如,标准文件名 utmp 将始终被处理为 utmp 记录文件。但非标准名称 log.utmp.1 被猜测为 utmp 记录文件。类似的猜测也应用于 lastlogwtmpacctpacctjournalevtx 文件。当与压缩或归档文件扩展名结合使用时,例如 .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
    • 识别 ISO 8601 格式(使用 ISO 描述性格式
      • YYYY-MM-DDThh:mm:ss
      • YYYY-MM-DDThhmmss
      • YYYYMMDDThhmmss(可以使用日期时间分隔符字符 'T' 或空格字符 ' '
    • 未识别 ISO 8601 格式
      • 缺少秒数
      • 序数日期,即“年份中的某一天”,格式 YYYY-DDD,例如 "2022-321"
      • 周日期,即“周数年”,格式 YYYY-Www-D,例如 "2022-W25-1"
      • 时间不带分钟和秒(即只有 hh
  • [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 通过管道传输到 GNU sort
  • 超级快速系统日志搜索器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,GNU sort 8.32
  • s4 0.7.75
  • logmerger 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_unrollslice.contains的定制实现。它用于字符串搜索,并专门用于绕过不必要的正则表达式匹配。根据此火焰图,正则表达式匹配非常昂贵。

根据此标准基准报告,slice_contains_X_2_unroll在某些情况下与memchrstringzilla表现相当。

请参阅完整的0.7.74 criterion基准报告


本地构建

请参阅安装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的grepsortsedawk按时间戳合并这两个日志消息!

此外,如果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 将不同的日志文件合并为一个按时间排序的连贯日志。


进一步阅读

星标

Stargazers over time


profile for @JamesThomasMoon on Stack Exchange, a network of free, community-driven Q&A sites

Dependencies

~25–38MB
~667K SLoC