journalctl命令

journalctl命令是Systemd日志系统的一个命令,主要用途是用来查看通过Systemd日志系统记录的日志,在Systemd出现之前,Linux系统及各应用的日志都是分别管理的,Systemd取代了initd之后便开始统一管理了所有Unit的启动日志,可以只用一个journalctl命令,查看所有内核和应用的日志。

语法

journalctl [OPTIONS...] [MATCHES...]

参数

  • --no-full, --full, -l: 当字段匹配可用列时将其省略,默认设置是显示完整字段,允许它们换行或被截断,旧的选项-l/--full不再有用,除了撤销--no-full
  • -a, --all: 完整显示所有字段,即使它们包含不可打印字符或非常长。
  • -f, --follow: 仅显示最近的日志条目,并在新条目附加到日志时连续打印。
  • -e, --pager-end: 立即跳到日志的结尾内隐含的工具,这意味着-n 1000可以保证分页器不会缓冲大小不受限制的日志,可以在命令行中使用显式的-n和其他一些数值来覆盖它,注意,这个选项只支持less页。
  • -n, --lines=: 显示最近的日志事件并限制显示的事件数,如果使用--follow,则隐含此选项,参数为正整数,是可选的,默认为10
  • --no-tail: 显示所有存储的输出行,即使在follow模式下也是如此,撤消--line=的效果。
  • -r, --reverse: 反转输出,以便首先显示最新的条目。
  • -o, --output=: 控制所显示的日志条目的格式,采用以下选项之一:
    • short: 默认值,并生成与经典syslog文件格式基本相同的输出,每个日志条目显示一行。
    • short-iso: 与short非常相似,但显示ISO 8601 wallclock时间戳。
    • short-precise: 与short非常相似,但是以微秒的精度显示时间戳。
    • short-monotonic: 非常相似,但是显示的是monotonic的时间戳,而不是wallclock的时间戳。
    • verbose: 显示具有所有字段的完整结构条目。
    • export: 将日志序列化成适合备份和网络传输的二进制流,主要是基于文本的。
    • json: 将条目格式化为JSON数据结构,每行一个。
    • json-pretty: 将条目格式化为JSON数据结构,但将它们格式化为多行,以使人们更容易阅读。
    • json-sse: 将条目格式化为JSON数据结构,但将它们包装为适合服务器发送的Eventsm的格式。
    • cat: 生成一个非常简洁的输出,只显示每个日志条目的实际消息,没有元数据,甚至没有时间戳。
  • -x, --catalog: 用来自消息目录的解释文本扩充日志行,这将向输出中可用的日志消息中添加解释性帮助文本,这些简短的帮助文本将解释错误或日志事件的上下文、可能的解决方案,以及指向支持论坛、开发人员文档和任何其他相关手册的指针,注意,帮助文本不是对所有消息都可用,而是仅对选定的消息可用。此外,将journalctl输出附加到错误报告时,请不要使用-x
  • -q, --quiet: 当以普通用户身份运行时,禁止显示有关不可访问的系统日志的任何警告消息。
  • -m, --merge: 显示所有可用的日志,包括远程日志的交叉条目。
  • -b [ID][±offset], --boot=[ID][±offset]: 显示来自特定启动的消息,这将为_BOOT_ID=添加匹配项,参数可能为空,在这种情况下,将显示当前引导的日志,如果省略引导ID,则正偏移量将查找从日志开始的引导,而等于或小于零的偏移量将查找从日志结束的引导,因此,1表示按时间顺序在日志中找到的第一个引导,2表示第二个引导,依此类推,而-0表示最后一个引导,-1表示最后一个引导之前的引导,依此类推,空偏移量等同于指定-0,除非当前引导不是最后一次引导,例如因为指定--directory查看来自不同计算机的日志。如果指定了32个字符的ID,则可以选择后跟偏移量,该偏移量标识相对于boot ID给定的引导,负值表示较早的引导,正值表示较晚的引导,如果未指定offset,则假定值为零,并显示ID给定的引导日志。
  • --list-boots: 显示引导编号(相对于当前引导)、它们的id以及与引导相关的第一条和最后一条消息的时间戳的列表。
  • -k, --dmesg: 只显示内核消息,这意味着-b并添加匹配_TRANSPORT=kernel
  • -u, --unit=UNIT|PATTERN: 显示指定的systemd单元单元的消息,或任何与PATTERN匹配的单元的消息,如果指定了模式,日志中找到的单元名称列表将与指定的模式进行比较,并使用所有匹配的内容,对于每个单元名,将为来自该单元的消息添加一个匹配_SYSTEMD_UNIT= unit,以及来自systemd的消息和关于指定单元的coredumps的消息的额外匹配,该参数可以指定多次。
  • --user-unit=: 显示指定用户会话单元的消息,这将为来自单元的消息_SYSTEMD_USER_UNIT=_UID=添加匹配,并为来自会话systemd的消息和关于指定单元的coredumps的消息添加额外匹配,该参数可以指定多次。
  • -p, --priority=: 根据消息优先级或优先级范围筛选输出,接受单个数字或文本日志级别(即在0 emerg7 debug之间),或以..形式表示的numeric/text日志级别范围,日志级别是syslog中记录的通常的syslog日志级别,即emerg 0alert 1crit 2err 3warning 4notice 5info 6debug 7,如果指定一个日志级别,则显示该级别或更低(值更低优先级更高)日志级别的所有消息,如果指定了一个范围,则将显示该范围内的所有消息,包括该范围的开始值和结束值,这将为指定的优先级添加PRIORITY=匹配项。
  • -c, --cursor=: 从传递的游标指定的日志位置开始显示条目。
  • --after-cursor=: 从该光标指定的位置之后的日志位置开始显示条目,使用--show-cursor选项时将显示光标。
  • --show-cursor: 光标显示在最后一项的两个破折号后,类似于-- cursor: s=0639...,光标的格式是私有的,可能会更改。
  • --since=, --until=: 分别在指定日期或更新日期,或在指定日期或更新日期开始显示条目,日期规范的格式应该是2012-10-30 18:17:16,如果省略了时间部分,则假定为00:00:00,如果只省略了seconds组件,则假定为:00,如果省略了date部分,则假定为当前日期,或者理解字符串yesterdaytodaytomorrow,分别表示当前日期的前一天00:00:00、当前日期的前一天00:00:00、当前日期的后一天,now指的是当前时间,最后,可以指定相对次数,以-+作为前缀,分别表示当前时间之前或之后的次数。
  • -F, --field=: 在日志的所有条目中打印指定字段可以接受的所有可能数据值。
  • --system, --user: 显示来自系统服务和内核的消息(使用--system),显示来自当前用户服务的消息(使用--user),如果两者都未指定,则显示用户可以看到的所有消息。
  • -M, --machine=: 显示来自运行中的本地容器的消息,指定要连接的容器名称。
  • -D DIR, --directory=DIR: 以目录路径作为参数,如果指定,journalctl将操作指定的日志目录DIR,而不是默认的运行时和系统日志路径。
  • --file=GLOB: 以文件glob作为参数,如果指定,journalctl将操作与GLOB匹配的指定日志文件,而不是默认的运行时和系统日志路径,可以指定多次,在这种情况下文件将被适当地交错。
  • --root=ROOT: 以目录路径作为参数,如果指定,journalctl将对指定目录下的目录文件层次结构而不是根目录进行操作,例如--update catalog将创建root/var/lib/systemd/catalog/database
  • --new-id128: 生成一个新的适合标识消息的128ID,而不是显示日志内容,这是为那些需要为他们引入的新消息使用新标识符并希望使其可识别的开发人员准备的,这将以三种不同的格式打印新的ID,这些格式可以复制到源代码或类似的文件中。
  • --header: 不是显示日志内容,而是显示所访问日志字段的内部头信息。
  • --disk-usage: 显示所有日志文件的当前磁盘使用情况。
  • --list-catalog [128-bit-ID...]: 以消息id表的形式列出消息目录的内容,以及它们的简短描述字符串,如果指定了任何128id,则只显示那些条目。
  • --dump-catalog [128-bit-ID...]: 显示消息目录的内容,条目由由两个破折号和ID组成的行分隔,格式与.catalog文件相同,如果指定了任何128id,则只显示那些条目。
  • --update-catalog: 更新消息目录索引,每次安装、删除或更新新的编目文件以重新生成二进制编目索引时,都需要执行此命令。
  • --setup-keys: 生成一个用于前向安全密封FSS的新密钥对,而不是显示日志内容,这将生成一个密封密钥和一个验证密钥,密封密钥存储在日志数据目录中,并保留在主机上,验证键应该存储在外部。
  • --force: 当传递了--setup keys并且已经配置了前向安全密封FSS时,重新创建FSS keys
  • --interval=: 指定使用--setup-keys生成FSS密钥对时密封密钥的更改间隔,较短的时间间隔会增加CPU消耗,但会缩短无法检测到的日志更改的时间范围,默认为15分钟。
  • --verify: 检查日志文件的内部一致性,如果文件是在启用FSS的情况下生成的,并且FSS验证密钥是用--verify key=指定的,则会验证日志文件的真实性。
  • --verify-key=: 指定用于--verify操作的FSS验证密钥。
  • --no-pager: 不将程序的输出内容管道pipe给分页程序。
  • --vacuum-size=BYTES: 将磁盘使用减少到指定大小以下。
  • --vacuum-files=INT: 仅保留指定数量的日记文件。
  • --vacuum-time=TIME: 任何早于指定时间点的条目都将被删除。
  • --rotate: 要求日志守护进程滚动日志文件,此命令会一直阻塞到滚动操作完成之后才会返回,日志滚动可以确保所有活动的日志文件都被关闭、并被重命名以完成归档,同时新的空白日志文件将被创建,并成为新的活动日志文件,通常可以与--vacuum-size=--vacuum-time=--vacuum-file=一起使用, 以提高日志清理的效率。
  • -h, --help: 输出帮助信息。
  • --version: 输出版本信息。

示例

显示本次启动以来的全部日志。

journalctl

显示内核日志。

journalctl -k

使用-n参数可以显示最后n行日志,如果不指定行数,默认显示10行。

journalctl -n 20

查看指定进程的日志。

journalctl _PID=1

显示最近30分钟的日志。

journalctl --since=-30m

显示2021年以来的日志。

journalctl --since="2021-01-01"

显示今天的日志。

journalctl --since=today

使用-f参数可以实现类型tail -f的功能,持续监控最新的日志。

journalctl -f

查看指定Unit的日志,-r可以反转输出,优先显示最新的日志。

journalctl -u nginx.service
journalctl -r -u nginx.service --since=-1h

查看日志占用的磁盘空间。

journalctl --disk-usage

要求日志守护进程滚动日志文件,日志滚动可以确保所有活动的日志文件都被关闭、并被重命名以完成归档,同时新的空白日志文件将被创建,并成为新的活动日志文件。

journalctl --rotate

清理一个周前的日志。

journalctl --vacuum-time=1week

将磁盘占用减少到指定大小以下。

journalctl --vacuum-size=10M

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

http://www.jinbuguo.com/systemd/journalctl.html# https://www.commandlinux.com/man-page/man1/journalctl.1.html https://blog.orchidflower.cn/2020/04/20/linux-command-introduction-04-journalctl/