本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
journalctl — 检索 systemd 日志
journalctl
[OPTIONS...] [MATCHES...]
journalctl 可用于检索 systemd(1) 日志(由 systemd-journald.service(8) 记录)。
如果不带任何参数直接调用此命令, 那么将显示所有日志内容 (从最早一条日志记录开始)。
如果指定了 [MATCHES...] 参数,
那么输出的日志将会按照 [MATCHES...] 参数进行过滤。
MATCHE 必须符合 "FIELD=VALUE
" 格式
(例如 "_SYSTEMD_UNIT=httpd.service
" ),
参见
systemd.journal-fields(7)
手册以了解日志字段的详细介绍。
如果有多个不同的字段被 [MATCHES...] 参数匹配,
那么这些字段之间使用"AND"逻辑连接,
也就是,日志项必须同时满足全部字段的匹配条件才能被输出。
如果同一个字段被多个 [MATCHES...] 参数匹配,
那么这些匹配条件之间使用"OR"逻辑连接,
也就是对于同一个字段,日志项只需满足任意一个匹配条件即可输出。
最后, "+
" 字符可用作 [MATCHES...] 组之间的分隔符,并被视为使用"OR"逻辑连接。
也就是,MATCHE1 MATCHE2 + MATCHE3 MATCHE4 MATCHE5 + MATCHE6 MATCHE7
相当于
( MATCHE1 MATCHE2 ) OR ( MATCHE3 MATCHE4 MATCHE5 ) OR ( MATCHE6 MATCHE7 )
还可以使用绝对路径作为参数来过滤日志。
绝对路径可以是普通文件,
也可以是软连接,
但必须指向一个确实存在的文件。
如果路径指向了一个二进制可执行文件,
那么它实际上相当于是一个对 "_EXE=
" 字段的匹配(仅匹配完整的绝对路径)。
如果路径指向了一个可执行脚本,
那么它实际上相当于是一个对 "_COMM=
" 字段的匹配(仅匹配脚本的文件名)。
如果路径指向了一个设备节点,
那么它实际上相当于是一个对 "_KERNEL_DEVICE=
"
字段的匹配(匹配该设备及其所有父设备的内核设备名称)。
在查询时,
软连接会被追踪到底,内核设备名称将被合成,
父设备将按照当时的实际情况被提列出来。
因为日志项一般并不包含标记实际物理设备的字段,
所以,设备节点一般就是实际物理设备的最佳代表。
但是又因为设备节点与物理设备之间的对应关系
在系统重启之后可能会发生变化,
所以,根据设备节点过滤日志仅对本次启动有意义,
除非你能确认对应关系在重启之后保持不变。
可以使用
--boot
, --unit=
等选项
进一步附加额外的约束条件(相当于使用"AND"逻辑连接)。
最终的输出结果来自所有可访问的日志文件的综合, 无论这些日志文件是否正在滚动或者正在被写入, 也无论这些日志文件是属于系统日志还是用户日志, 只要有访问权限,就会被包括进来。
用于提取日志的日志文件的集合可以使用
--user
,
--system
, --directory
,
--file
选项进行筛选。
每个用户
都可以访问其专属的用户日志。
但是默认情况下,
只有root用户以及
"systemd-journal
", "adm
",
"wheel
" 组中的用户才可以访问全部的日志(系统与其他用户)。
注意,一般发行版还会给 "adm
"
与 "wheel
" 组一些其他额外的特权。
例如 "wheel
" 组的用户一般都可以
执行一些系统管理任务。
默认情况下,结果会通过 less 工具进行分页输出,
并且超长行会在屏幕边缘被截断。
不过,被截掉的部分可以通过左右箭头按键查看。
如果不想分页输出,那么可以使用
--no-pager
选项,
参见下面的"环境变量"小节。
如果是输出到 tty 的话, 行的颜色还会根据日志的级别变化: ERROR 或更高级别为红色,NOTICE 或更高级别为高亮, DEBUG 级别为淡灰,其他级别则正常显示。
能够识别的命令行选项如下:
--no-full
, --full
, -l
¶如果字段内容超长 则以省略号(…)截断以适应列宽。 默认显示完整的字段内容 (超长的部分换行显示或者被分页工具截断)。
老旧的
-l
/--full
选项
仅用于撤销已有的 --no-full
选项,除此之外没有其他用处。
-a
, --all
¶完整显示所有字段内容,即使其中包含非打印字符或者字段内容超长。 默认情况下,包含非打印字符的字段将被缩写为"blob data"(二进制数据)。 注意,分页程序可能会再次转义非打印字符
-f
, --follow
¶只显示最新的日志项, 并且不断显示新生成的日志项。 此选项隐含了 -n 选项。
-e
, --pager-end
¶在分页工具内
立即跳转到日志的尾部。
此选项隐含了 -n1000
以确保分页工具不必缓存太多的日志行。
不过这个隐含的行数可以被明确设置的
-n
选项覆盖。
注意,此选项仅可用于
less(1)
分页器。
-n
, --lines=
¶限制显示最新的日志行数。
--pager-end
与
--follow
隐含了此选项。
此选项的参数:若为正整数则表示最大行数;
若为 "all
" 则表示不限制行数;
若不设参数则表示默认值10行。
--no-tail
¶显示所有日志行,
也就是用于撤销已有的 --lines=
选项(即使与 -f 连用)。
-r
, --reverse
¶反转日志行的输出顺序, 也就是最先显示最新的日志。
-o
, --output=
¶控制日志的 输出格式。 可以使用如下选项:
short
¶这是默认值, 其输出格式与传统的 syslog 文件的格式相似, 每条日志一行。
short-full
¶与 short
类似,只是将时间戳字段
按照 --since=
与 --until=
接受的格式显示。
与 short
的不同之处在于,
输出的时间戳中还包含星期、年份、时区信息,并且与系统的本地化设置无关。
short-iso
¶与 short
类似,只是将时间戳字段以 ISO 8601 格式
显示。
short-iso-precise
¶与 short-iso
类似,只是将时间戳字段的秒数
精确到了微秒级别(百万分之一秒)。
short-precise
¶与 short
类似,只是将时间戳字段的秒数
精确到了微秒级别(百万分之一秒)。
short-monotonic
¶与 short
类似,只是将时间戳字段的零值
从内核启动时开始计算。
short-unix
¶与 short
类似,只是将时间戳字段显示为从"UNIX时间原点"(1970-1-1 00:00:00 UTC)以来的秒数。
精确到微秒级别。
verbose
¶以结构化的格式显示 每条日志的所有字段。
export
¶将日志序列化为二进制字节流 (大部分依然是文本), 以适用于备份与网络传输(详见 Journal Export Format 文档)。亦可使用 systemd-journal-remote.service(8) 工具将二进制字节流转换为本地 journald 格式。
json
¶将日志项格式化为 JSON 对象,并用换行符分隔(也就是每条日志一行,详见 Journal JSON Format 文档)。 字段值通常按照 JSON 字符串规范进行编码,但是如下三种情况例外:
大于4096字节的字段将被编码为 null
值(可以使用
--all
选项关闭此特性,但是这样做会导致生成又大又长的
JSON 对象)。
日志中允许存在同名字段,但是在 JSON 对象中不允许。 因此,同名字段的多个值在 JSON 对象中将会被 编码为一个数组。
包含非打印字符或非UTF8字符的字段, 将被编码为包含原始二进制字节的数组(其中的每个字节都视为一个无符号整数)。
注意,这种编码方式是可逆的(存在空间大小的限制)。
json-pretty
¶将日志项按照JSON数据结构格式化, 但是每个字段一行, 以便于人类阅读。
json-sse
¶将日志项按照JSON结构格式化,每条日志一行,但是用大括号包围, 以符合 Server-Sent Events 的要求。
json-seq
¶将日志项按照JSON结构格式化,
同时为每条日志加上一个ASCII记录分隔符(0x1E)前缀以及一个ASCII换行符(0x0A)后缀,以符合 JavaScript Object Notation (JSON) Text Sequences
("application/json-seq
") 的要求。
cat
¶仅显示日志的实际内容, 而不显示与此日志相关的 任何元数据(包括时间戳)。
with-unit
¶与 short-full 类似, 但是在日志项前缀中使用单元名称代替传统的 syslog 标识。 这对于从模板实例化而来的单元比较有意义, 因为会在单元名称中包含实例化参数。
--output-fields=
¶一个逗号分隔的字段名称列表,表示仅输出列表中的字段。
仅影响默认输出全部字段的输出格式(verbose
,
export
, json
, json-pretty
, json-sse
,
json-seq
)。注意, "__CURSOR
", "__REALTIME_TIMESTAMP
",
"__MONOTONIC_TIMESTAMP
", "_BOOT_ID
" 字段永远输出,
不能被排除。
--utc
¶以世界统一时间(UTC) 表示时间
--no-hostname
¶不显示来源于本机的日志消息的主机名字段。
此选项仅对 short
系列输出格式(见上文)有效。
-x
, --catalog
¶在日志的输出中 增加一些解释性的短文本, 以帮助进一步说明 日志的含义、 问题的解决方案、支持论坛、 开发文档、以及其他任何内容。 并非所有日志都有 这些额外的帮助文本, 详见 Message Catalog Developer Documentation 文档。
注意,如果要将日志输出用于bug报告, 请不要使用 此选项。
-q
, --quiet
¶安静模式, 也就是当以普通用户身份运行时, 不显示任何警告信息与提示信息。 例如: "-- Logs begin at …", "-- Reboot --"
-m
, --merge
¶混合显示 包括来自于其他远程主机的日志在内的所有可见日志。
-b [ID
][±offset
]
, --boot=[ID
][±offset
]
¶显示特定于某次启动的日志,
这相当于添加了一个 "_BOOT_ID=
" 匹配条件。
如果未指定 ID
与 ±offset
参数,
则表示仅显示本次启动的日志。
如果省略了 ID
,
那么当 ±offset
是正数的时候,
将从日志头开始正向查找,
否则(也就是为负数或零)将从日志尾开始反响查找。
举例来说,
"-b 1"表示按时间顺序排列最早的那次启动,
"-b 2"则表示在时间上第二早的那次启动;
"-b -0"表示最后一次启动,
"-b -1"表示在时间上第二近的那次启动,
以此类推。
如果 ±offset
也省略了,
那么相当于"-b -0",
除非本次启动不是最后一次启动(例如用 --directory
指定了
另外一台主机上的日志目录)。
如果指定了32字符的 ID
,
那么表示以此
ID
所代表的那次启动为基准
计算偏移量(±offset
),
计算方法同上。
换句话说,
省略 ID
表示以本次启动为基准
计算偏移量(±offset
)。
--list-boots
¶列出每次启动的 序号(也就是相对于本次启动的偏移量)、32字符的ID、 第一条日志的时间戳、最后一条日志的时间戳。
-k
, --dmesg
¶仅显示内核日志。隐含了
-b
选项以及
"_TRANSPORT=kernel
" 匹配项。
-t
, --identifier=SYSLOG_IDENTIFIER
¶仅显示 syslog
识别符为
SYSLOG_IDENTIFIER
的日志项。
可以多次使用该选项以 指定多个识别符。
-u
, --unit=UNIT
|PATTERN
¶仅显示
属于特定单元的日志。
也就是单元名称正好等于 UNIT
或者符合 PATTERN
模式的单元。
这相当于添加了一个
"_SYSTEMD_UNIT=
"
匹配项(对于
UNIT
UNIT
来说),
或一组匹配项(对于
PATTERN
来说)。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
--user-unit=
¶仅显示
属于特定用户会话单元的日志。
相当于同时添加了
"_SYSTEMD_USER_UNIT=
" 与
"_UID=
"
两个匹配条件。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
-p
, --priority=
¶根据
日志等级(包括等级范围)
过滤输出结果。
日志等级数字与其名称之间的
对应关系如下
(参见
syslog(3)):
"emerg
" (0),
"alert
" (1), "crit
" (2),
"err
" (3), "warning
" (4),
"notice
" (5), "info
" (6),
"debug
" (7) 。
若设为一个单独的数字或日志等级名称,
则表示仅显示小于或等于此等级的日志(也就是重要程度等于或高于此等级的日志)。
若使用 FROM..TO.. 设置一个范围,
则表示仅显示指定的等级范围内(含两端)的日志。
此选项相当于添加了 "PRIORITY=
"
匹配条件。
-g
, --grep=
¶使用指定的正则表达式对 MESSAGE=
字段进行过滤,仅输出匹配的日志项。
必须使用 PERL 兼容的正则表达式,详细语法参见
pcre2pattern(3)
手册。
如果正则表达式中仅含小写字母,那么将自动进行大小写无关的匹配,
否则将使用大小写敏感的匹配。是否大小写敏感可以使用下面的
--case-sensitive
选项强制指定。
--case-sensitive[=BOOLEAN]
¶是否对正则表达式进行大小写敏感的匹配。
-c
, --cursor=
¶从指定的游标(cursor)开始显示日志。 [提示]每条日志都有一个"__CURSOR"字段,类似于该条日志的指纹。
--after-cursor=
¶从指定的游标(cursor)
之后开始显示日志。
如果使用了 --show-cursor
选项,
则也会显示游标本身。
--show-cursor
¶在最后一条日志之后显示游标, 类似下面这样,以"--"开头:
-- cursor: s=0639…
游标的具体格式是私有的(也就是没有公开的规范), 并且会变化。
-S
, --since=
, -U
, --until=
¶显示晚于指定时间(--since=)的日志、显示早于指定时间(--until=)的日志。
参数的格式类似 "2012-10-30 18:17:16
" 这样。
如果省略了"时:分:秒"部分,则相当于设为 "00:00:00
" 。
如果仅省略了"秒"的部分则相当于设为 ":00
" 。
如果省略了"年-月-日"部分,则相当于设为当前日期。
除了"年-月-日 时:分:秒"格式,参数还可以进行如下设置:
(1)设为 "yesterday
", "today
", "tomorrow
" 以表示那一天的零点(00:00:00)。
(2)设为 "now
" 以表示当前时间。
(3)可以在"年-月-日 时:分:秒"前加上 "-
"(前移) 或 "+
"(后移) 前缀以表示相对于当前时间的偏移。
关于时间与日期的详细规范,参见 systemd.time(7)
注意, --output=short-full
将会一丝不苟的严格按照上述格式输出时间戳。
-F
, --field=
¶显示所有日志中指定字段的所有可能值。
[译者注]类似于SQL语句:"SELECT DISTINCT 指定字段 FROM 全部日志
"
-N
, --fields
¶输出所有日志字段的名称
--system
, --user
¶仅显示
系统服务与内核的日志(--system
)、
仅显示当前用户的日志(--user
)。
如果两个选项都未指定,则显示当前用户的所有可见日志。
-M
, --machine=
¶显示来自于正在运行的、特定名称的本地容器的日志。 参数必须是一个本地容器的名称。
-D DIR
, --directory=DIR
¶仅显示 特定目录中的日志, 而不是 默认的运行时和系统日志目录中的日志。
--file=GLOB
¶GLOB
是一个
可以包含"?"与"*"的文件路径匹配模式。
表示仅显示来自与指定的 GLOB
模式匹配的文件中的日志,
而不是默认的运行时和系统日志目录中的日志。
可以多次使用此选项
以指定多个匹配模式(多个模式之间用"OR"逻辑连接)。
--root=ROOT
¶在对日志进行操作时,
将 ROOT
视为系统的根目录。
例如 --update-catalog
将会创建
文件,
并且将会显示 ROOT
/var/lib/systemd/catalog/database
或 ROOT
/run/journal
目录中的日志。
ROOT
/var/log/journal
--header
¶此选项并不用于显示日志内容, 而是用于显示 日志文件内部的头信息(类似于元数据)。
--disk-usage
¶此选项并不用于显示日志内容, 而是用于显示 所有日志文件(归档文件与活动文件)的磁盘占用总量。
--vacuum-size=
, --vacuum-time=
, --vacuum-files=
¶这些选项并不用于显示日志内容,而是用于清理过期的日志归档文件(并不清理活动的日志文件),以释放磁盘空间。
--vacuum-size=
可用于限制归档文件的最大磁盘使用量(可以使用
"K
", "M
", "G
", "T
" 后缀);
--vacuum-time=
可用于清除指定时间之前的归档(可以使用 "s
",
"m
", "h
", "days
", "weeks
",
"months
", "years
" 后缀);
--vacuum-files=
可用于限制日志归档文件的最大数量。
注意,--vacuum-size=
对 --disk-usage
的输出仅有间接效果,
因为 --disk-usage
输出的是归档日志与活动日志的总量。
同样,--vacuum-files=
也未必一定会减少日志文件的总数,
因为它同样仅作用于归档文件而不会删除活动的日志文件。
此三个选项可以同时使用, 以同时从三个维度去限制归档文件。 若将某选项设为零, 则表示取消此选项的限制。
此三个选项还可以和 --rotate
一起使用,
表示首先滚动所有日志归档,
然后再执行清理操作。
这样可以确保首先完成所有活动日志的归档,
进而使得清理操作变得非常高效。
--list-catalog
[128-bit-ID…
]
¶简要列出日志分类信息, 其中包括对分类信息的简要描述。
如果明确指定了分类ID(128-bit-ID
),
那么仅显示指定的分类。
--dump-catalog
[128-bit-ID…
]
¶详细列出
日志分类信息
(格式与 .catalog
文件相同)。
如果明确指定了分类ID(128-bit-ID
),
那么仅显示指定的分类。
--update-catalog
¶更新 日志分类索引二进制文件。 每当安装、删除、更新了分类文件, 都需要执行一次此动作。
--setup-keys
¶此选项并不用于显示日志内容,
而是用于生成一个新的FSS(Forward Secure Sealing)密钥对。
此密钥对包含一个"sealing key"
与一个"verification key"。
"sealing key"保存在本地日志目录中,
而"verification key"则必须保存在其他地方。详见
journald.conf(5)
中的
Seal=
选项。
--force
¶与 --setup-keys
连用,
表示即使已经配置了FSS(Forward Secure Sealing)密钥对,
也要强制重新生成。
--interval=
¶与 --setup-keys
连用,
指定"sealing key"的变化间隔。
较短的时间间隔会导致占用更多的CPU资源,
但是能够减少未检测的日志变化时间。
默认值是 15min
--verify
¶检查日志文件的内在一致性。
如果日志文件在生成时开启了FSS特性,
并且使用
--verify-key=
指定了FSS的"verification key",
那么,同时还将验证日志文件的真实性。
--verify-key=
¶与 --verify
选项连用,
指定FSS的"verification key"
--sync
¶要求日志守护进程 将所有未写入磁盘的日志数据刷写到磁盘上, 并且一直阻塞到刷写操作实际完成之后才返回。 因此该命令可以保证当它返回的时候, 所有在调用此命令的时间点之前的日志, 已经全部安全的刷写到了磁盘中。
--flush
¶要求日志守护进程
将 /run/log/journal
中的日志数据
刷写到 /var/log/journal
中
(如果持久存储设备当前可用的话)。
此操作会一直阻塞到操作完成之后才会返回,
因此可以确保在该命令返回时,
数据转移确实已经完成。
注意,此命令仅执行一个单独的、一次性的转移动作,
若没有数据需要转移,
则此命令什么也不做,
并且也会返回一个
表示操作已正确完成的返回值。
--rotate
¶要求日志守护进程滚动日志文件。此命令会一直阻塞到滚动操作完成之后才会返回。
日志滚动可以确保所有活动的日志文件都被关闭、并被重命名以完成归档,
同时,新的空白日志文件将被创建,并成为新的活动日志文件。
此选项可以与 --vacuum-size=
,
--vacuum-time=
, --vacuum-file=
一起使用,
以提高日志清理的效率。
-h
, --help
¶--version
¶--no-pager
¶不将程序的输出内容管道(pipe)给分页程序。
$SYSTEMD_PAGER
¶指定分页程序。仅在未指定 --no-pager
选项时有意义。
此变量会覆盖 $PAGER
的值。如果 $SYSTEMD_PAGER
与 $PAGER
都未设置,
那么将会依次尝试如下常见的分页程序:
less(1),
more(1),
如果最终仍未找到分页程序,那么将不使用分页。
将此变量设为空字符串或 "cat
" 等价于使用 --no-pager
选项。
$SYSTEMD_LESS
¶用于覆盖默认传递给 less
程序的命令行选项("FRSXMK
")。
如果 $SYSTEMD_LESS
的值不含 "K
" ,
并且使用 less 作为分页程序,那么
Ctrl+C 信号将会被忽略。
这将允许 less 自己处理
Ctrl+C 信号。
$SYSTEMD_LESSCHARSET
¶用于覆盖默认传递给 less 程序的字符集。
(如果终端兼容 UTF-8 ,那么默认值是 "utf-8
" )
不带任何选项与参数, 表示显示全部日志
journalctl
仅指定一个匹配条件, 显示所有符合该匹配条件的日志
journalctl _SYSTEMD_UNIT=avahi-daemon.service journalctl _SYSTEMD_CGROUP=/user.slice/user-42.slice/session-c1.scope
指定了两个不同字段的匹配条件, 显示同时满足两个匹配条件的日志
journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097
指定了同一个字段的两个不同匹配条件, 显示满足其中任意一个条件的日志
journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
使用 "+
"
连接
两组匹配条件,
相当于
逻辑"OR"连接
journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service
要显示由特定单元产生的、关于特定单元的日志,
可使用 -u
/--unit=
选项。
journalctl -u name
将被展开为类似于如下过滤器:
_SYSTEMD_UNIT=name
.service + UNIT=name
.service _PID=1 + OBJECT_SYSTEMD_UNIT=name
.service _UID=0 + COREDUMP_UNIT=name
.service _UID=0 MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1
(参见 systemd.journal-fields(5) 手册以了解对上述日志字段的解释)
显示所有 D-Bus 进程产生的日志
journalctl /usr/bin/dbus-daemon
显示上一次启动所产生的所有内核日志
journalctl -k -b -1
持续显示
apache.service
服务不断生成的日志
journalctl -f -u apache