linuxjournalctl命令查询systemdinit系统⽇志
journalctl ⽤来查询 systemd-journald 服务收集到的⽇志。systemd-journald 服务是 systemd init 系统提供的收集系统⽇志的服务。
命令格式为:
journalctl [OPTIONS…] [MATCHES…]
journalctl 命令的路径为:
/bin/journalctl
Help
可以通过 man page 和 -h 选项来获得最直接的帮助⽂档:
$ man journalctl
$ journalctl -h
输出所有的⽇志记录
不带任何选项时,journalctl 输出所有的⽇志记录:
$ sudo journalctl
这基本上没什么⽤处,因为你⽴即就被洪⽔般的⽇志记录给淹没了。所以,接下来我们学习如何⾼效的过滤出有价值的⽇志信息。
匹配(match)
我们可以通过 "FIELD=VALUE" 的格式来匹配具体的⽇志记录, 如:
_SYSTEMD_UNIT=cron.service
⽇志信息的定义也类似⼀个实体类型,具体的信息被保存在各个对应的字段中,⽐如 MESSAGE、MESSAGE_ID、_PID、_UID、linux在线命令查询平台
_HOSTNAME、_SYSTEMD_UNIT 等等(通过 man 7 systemd.journal-fields 可以查看所有可⽤的 match 字段)。因此可以通过这些字段的内容匹配相关的⽇志记录:
上图中的输出是 cron.service 服务相关的⽇志记录。
可以同时添加多个字段进⾏匹配,它们之间是与的关系,就是同时符合多个条件的记录才会被匹配,⽐如添加 PRIORITY 字段的匹配条件:
$ journalctl _SYSTEMD_UNIT=cron.service PRIORITY=6
注意各个字段的取值,⽐如为 PRIORITY 设置 debug、info 是不⼯作的,必须设置为对应的数字。可以通过 -F 选项来查看某个字段的可选值:
$ journal -F PRIORITY
具体的对应⽅式如下:
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
对同⼀个字段应⽤多个 match 条件的情况,⽐如:
$ journalctl _SYSTEMD_UNIT=cron.service _SYSTEMD_UNIT=prometheus.service
此时 cron.service 和 prometheus.service 的⽇志都会输出。
多个 match 条件的或操作
使⽤ "+" 号可以对多个匹配字段执⾏或操作:
$ journalctl _SYSTEMD_UNIT=cron.service + _PID=28097
上⾯的命令会输出 cron.service 的⽇志和进程 28097 的⽇志。
下⾯是⼀个更复杂的例⼦:
$ journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service
前⾯的两个条件是与的关系,最后⼀个条件与前⾯的两个条件是或的关系,也就是相对于⽤⼩括号把前⾯的两个条件括起来。
把⽇志保存到⽂件中
systemd-journald 服务收集到的⽇志默认保存在 /run/log ⽬录中,重启系统会丢掉以前的⽇志信息。
我们可以通过两种⽅式让systemd-journald 服务把所有的⽇志都保存到⽂件中,这样重新启动后就不会丢掉以前的⽇志。
⽅法⼀:创建⽬录 /var/log/journal,然后重启⽇志服务 systemd-journald.service。
⽅法⼆:修改配置⽂件 /etc/f,把 Storage=auto 改为 Storage=persistent,并取消注释,然后重启⽇志服务systemd-journald.service。
⽅法⼀的详细操作
在 /var/log/ 下⾯创建名为 journal 的⽬录,并设置权限即可:
$ sudo mkdir /var/log/journal
$ sudo chown root:systemd-journal /var/log/journal
$ sudo chmod 2775 /var/log/journal
$ sudo systemctl restart systemd-journald.service
之后 /run/log 下⾯就没有 journal 的⽇志了,⽇志⽂件被保存在 /var/log/journal ⽬录下:
查看⽇志占据的磁盘空间
$ sudo journalctl --disk-usage
注意:⽆论是否设置把⽇志存储到⽂件,都会得到 disk-usage。
清理⽇志数据
如果⼤家打算对 journal 记录进⾏清理,则可使⽤两种不同⽅式。
使⽤ –vacuum-size 选项
使⽤ –vacuum-time 选项
如果使⽤ –vacuum-size 选项,则可硬性指定⽇志的总体体积,意味着其会不断删除旧有记录直到所占容量符合要求:
$ sudo journalctl --vacuum-size=1G
另⼀种⽅式则是使⽤ –vacuum-time 选项。任何早于这⼀时间点的条⽬都将被删除。例如,去年之后的条⽬才能保留:
$ sudo journalctl --vacuum-time=1years
限定⽇志所能占⽤的最⾼容量
我们可以通过 /etc/f ⽂件来配置 systemd-journald 服务的⾏为。以下条⽬可⽤于限定⽇志数据可以占⽤的最⼤存储数量和⽇志数据体积的膨胀速度:
SystemMaxUse=:指定journal所能使⽤的最⾼持久存储容量。
SystemKeepFree=:指定journal在添加新条⽬时需要保留的剩余空间。
SystemMaxFileSize=:控制单⼀journal⽂件⼤⼩,符合要求⽅可被转为持久存储。
RuntimeMaxUse=:指定易失性存储中的最⼤可⽤磁盘容量(/run⽂件系统之内)。
RuntimeKeepFree=:指定向易失性存储内写⼊数据时为其它应⽤保留的空间量(/run⽂件系统之内)。
RuntimeMaxFileSize=:指定单⼀journal⽂件可占⽤的最⼤易失性存储容量(/run⽂件系统之内)。
通过设置上述值,⼤家可以控制 systemd-journald 服务对服务器空间的消耗及保留⽅式。
查看某次启动后的⽇志
默认情况下 systemd-journald 服务只保存本次启动后的⽇志(重新启动后丢掉以前的⽇志)。此时 -b 选项是没啥⽤的。当我们把systemd-journald 服务收集到的⽇志保存到⽂件中之后,就可以通过下⾯的命令查看系统的重启记录:
$ journalctl --list-boots
此时我们就可以通过 -b 选项来选择查看某次运⾏过程中的⽇志:
$ sudo journalctl -b -1
$ sudo journalctl -b 9eaabbc25fe343999ef1024e6a16fb58
下⾯的命令都会输出最后⼀次启动后的⽇志信息:
$ sudo journalctl -b
$ sudo journalctl -b  0
查看指定时间段的⽇志
利⽤ --since 与 --until 选项设定时间段,⼆者分别负责指定给定时间之前与之后的⽇志记录。时间值可以使⽤多种格式,⽐如下⾯的格式:
YYYY-MM-DD HH:MM:SS
如果我们要查询 2018 年 3 ⽉ 26 ⽇下午 8:20 之后的⽇志:
$ journalctl --since "2018-03-26 20:20:00"
如果以上格式中的某些组成部分未进⾏填写,系统会直接进⾏默认填充。例如,如果⽇期部分未填写,则会直接显⽰当前⽇期。如果时间部分未填写,则缺省使⽤ "00:00:00"(午夜)。秒字段亦可留空,默认值为 "00",⽐如下⾯的命令:
$ journalctl --since "2018-03-26" --until "2018-03-26 03:00"
另外,journalctl 还能够理解部分相对值及命名简写。例如,⼤家可以使⽤ "yesterday"、"today"、"tomorrow" 或者 "now" 等。
⽐如获取昨天的⽇志数据可以使⽤下⾯的命令:
$ journalctl --since yesterday
要获得早上 9:00 到⼀⼩时前这段时间内的⽇志,可以使⽤下⾯的命令:
$ journalctl --since 09:00 --until "1 hour ago"
同时应⽤ match 和时间过滤条件
实际的使⽤中更常见的⽤例是同时应⽤ match 和时间条件,⽐如要过滤出某个时间段中 cron 服务的⽇志记录:
$ sudo journalctl _SYSTEMD_UNIT=cron.service --since "2018-03-27" --until "2018-03-27 01:00"
按 unit 过滤⽇志
systemd 把⼏乎所有的任务都抽象成了 unit,因此我们可以⽅便的使⽤ -u 选项通过 unit 的名称来过滤器⽇志记录。查看某个 unit 的⽇志:
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
还可以使⽤多个 -u 选项同时获得多个 unit 的⽇志:
$ journalctl -u nginx.service -u php-fpm.service --since today
通过⽇志级别进⾏过滤
除了通过 PRIORITY= 的⽅式,还可以通过 -p 选项来过滤⽇志的级别。 可以指定的优先级如下:
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err
注意,这⾥指定的是优先级的名称。
实时更新⽇志
与 tail -f 类似,journalctl ⽀持 -f 选项来显⽰实时的⽇志:
$ sudo journalctl -f
如果要查看某个 unit 的实时⽇志,再加上 -u 选项就可以了:
$ sudo journalctl -f -u prometheus.service
只显⽰最新的 n ⾏
命令⾏选项 -n ⽤来控制只显⽰最新的 n ⾏⽇志,默认是显⽰尾部的最新 10 ⾏⽇志:
$ sudo journalctl -n
也可以显⽰尾部指定⾏数的⽇志:
$ sudo journalctl -n 20
下⾯则是显⽰ cron.service 服务最新的三⾏⽇志:
$ journalctl -u cron.service -n 3
控制输出
把结果重定向到标准输出
默认情况下,journalctl 会在 pager 内显⽰输出结果。如果⼤家希望利⽤⽂本操作⼯具对数据进⾏处理,则需要使⽤标准输出。在这种情况下,我们需要使⽤ --no-pager 选项。
$ sudo journalctl --no-pager

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。