# journalctl命令 `journalctl`命令是`Systemd`日志系统的一个命令,主要用途是用来查看通过`Systemd`日志系统记录的日志,在`Systemd`出现之前,`Linux`系统及各应用的日志都是分别管理的,`Systemd`取代了`initd`之后便开始统一管理了所有`Unit`的启动日志,可以只用一个`journalctl`命令,查看所有内核和应用的日志。 ## 语法 ```shell 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 emerg`和`7 debug`之间),或以`..`形式表示的`numeric/text`日志级别范围,日志级别是`syslog`中记录的通常的`syslog`日志级别,即`emerg 0`、`alert 1`、`crit 2`、`err 3`、`warning 4`、`notice 5`、`info 6`、`debug 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`部分,则假定为当前日期,或者理解字符串`yesterday`、`today`、`tomorrow`,分别表示当前日期的前一天`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`: 生成一个新的适合标识消息的`128`位`ID`,而不是显示日志内容,这是为那些需要为他们引入的新消息使用新标识符并希望使其可识别的开发人员准备的,这将以三种不同的格式打印新的`ID`,这些格式可以复制到源代码或类似的文件中。 * `--header`: 不是显示日志内容,而是显示所访问日志字段的内部头信息。 * `--disk-usage`: 显示所有日志文件的当前磁盘使用情况。 * `--list-catalog [128-bit-ID...]`: 以消息`id`表的形式列出消息目录的内容,以及它们的简短描述字符串,如果指定了任何`128`位`id`,则只显示那些条目。 * `--dump-catalog [128-bit-ID...]`: 显示消息目录的内容,条目由由两个破折号和`ID`组成的行分隔,格式与`.catalog`文件相同,如果指定了任何`128`位`id`,则只显示那些条目。 * `--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`: 输出版本信息。 ## 示例 显示本次启动以来的全部日志。 ```shell journalctl ``` 显示内核日志。 ```shell journalctl -k ``` 使用`-n`参数可以显示最后`n`行日志,如果不指定行数,默认显示`10`行。 ```shell journalctl -n 20 ``` 查看指定进程的日志。 ```shell journalctl _PID=1 ``` 显示最近`30`分钟的日志。 ```shell journalctl --since=-30m ``` 显示`2021`年以来的日志。 ```shell journalctl --since="2021-01-01" ``` 显示今天的日志。 ```shell journalctl --since=today ``` 使用`-f`参数可以实现类型`tail -f`的功能,持续监控最新的日志。 ```shell journalctl -f ``` 查看指定`Unit`的日志,`-r`可以反转输出,优先显示最新的日志。 ```shell journalctl -u nginx.service journalctl -r -u nginx.service --since=-1h ``` 查看日志占用的磁盘空间。 ```shell journalctl --disk-usage ``` 要求日志守护进程滚动日志文件,日志滚动可以确保所有活动的日志文件都被关闭、并被重命名以完成归档,同时新的空白日志文件将被创建,并成为新的活动日志文件。 ```shell journalctl --rotate ``` 清理一个周前的日志。 ```shell journalctl --vacuum-time=1week ``` 将磁盘占用减少到指定大小以下。 ```shell 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/ ```