linux工具-journalctl

有时候,当linux服务启动失败的时候,系统会提示我们使用journalctl -xe命令来查询详细信息,定位服务不能启动的原因。

journalctl 用来查询 systemd-journald 服务收集到的日志。systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务。

命令格式为:

journalctl [OPTIONS…] [MATCHES…]

journalctl 命令的路径为:

/bin/journalctl

 

可以使用man和-h来查询详细用法

man journalctl
journal ctl -h

image.png

 

输出所有日志

    不带任何选项时,journalctl 输出所有的日志记录,没啥鸟用

 

匹配(match)

    我们可以通过 "FIELD=VALUE" 的格式来匹配具体的日志记录, 如:_SYSTEMD_UNIT=sshd.service

journalctl _SYSTEMD_UNIT=sshd.service

image.png

日志信息的定义也类似一个实体类型,具体的信息被保存在各个对应的字段中,比如 MESSAGE、MESSAGE_ID、_PID、_UID、_HOSTNAME、_SYSTEMD_UNIT 等等(通过 man 7 systemd.journal-fields 可以查看所有可用的 match 字段)。因此可以通过这些字段的内容匹配相关的日志记录:

 

可以同时添加多个字段进行匹配,它们之间是与的关系,就是同时符合多个条件的记录才会被匹配,比如添加 PRIORITY 字段的匹配条件:

journalctl _SYSTEMD_UNIT=sshd.service PRIORITY=6

image.png

 

注意各个字段的取值,比如为 PRIORITY (可以用 -p 来代替PRIORITY)设置 debug、info 是不工作的,必须设置为对应的数字。可以通过 -F 选项来查看某个字段的可选值:

image.png

0: emerg

1: alert

2: crit

3: err

4: warning

5: notice

6: info

7: debug

 

 

对同一个字段应用多个 match 条件的情况,比如:
 

journalctl _SYSTEMD_UNIT=sshd.service _SYSTEMD_UNIT=httpd.service


    此时 ,两个服务的日志都会输出过来

 

多个 match 条件的或操作

使用 "+" 号可以对多个匹配字段执行或操作: 
 

 journalctl _SYSTEMD_UNIT=sshd.servcie + _PID=28097



    上面的命令会输出 sshd.service 的日志和进程 28097 的日志。

    systemd-journald 服务收集到的日志默认保存在 /run/log 目录中,重启系统会丢掉以前的日志信息。 我们可以通过两种方式让 systemd-journald 服务把所有的日志都保存到文件中,这样重新启动后就不会丢掉以前的日志。

把日志保存到文件中

方法一:创建目录 /var/log/journal,然后重启日志服务 systemd-journald.service。
image.png

方法二:修改配置文件 /etc/systemd/journald.conf,把 Storage=auto 改为 Storage=persistent,并取消注释,然后重启日志服务 systemd-journald.service。

方法一的详细操作

在 /var/log/ 下面创建名为 journal 的目录,并设置权限即可:
 

mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod 2775 /var/log/journal
systemctl restart systemd-journald.service



    之后 /run/log 下面就没有 journal 的日志了,日志文件被保存在 /var/log/journal 目录下:

image.png

 

 

查看重启后的日志

journalctl --list-boots

image.png

可以看到,每次重启的信息都存在了

 

此时我们就可以通过 -b 选项来选择查看某次运行过程中的日志:
 

journalctl -b -1

image.png


 

journalctl -b 9eaabbc25fe343999ef1024e6a16fb58


下面的命令都会输出最后一次启动后的日志信息:
 

journalctl -b
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 和时间条件,比如要过滤出某个时间段中sshd服务的日志记录:
 

journalctl _SYSTEMD_UNIT=sshd.service --since "2018-07-28" --until "2018-7-29 01:00"

 

按 unit 过滤日志

systemd 把几乎所有的任务都抽象成了 unit,因此我们可以方便的使用 -u 选项通过 unit 的名称来过滤器日志记录。查看某个 unit 的日志:

journalctl -u ssd.service
journalctl -u nginx.service --since today



还可以使用多个 -u 选项同时获得多个 unit 的日志:
 

journalctl -u nginx.service -u php-fpm.service --since today

关于journalctl 还可以参考https://www.cnblogs.com/cocowool/p/systemd_journal_log.html

详细介绍https://blog.51cto.com/13598893/2072212 

Linux 系统中使用 `journalctl` 命令时出现 `unrecognized option` 错误,通常是因为尝试使用的命令行选项在当前版本的 `journalctl` 中不被支持,或者拼写错误导致解析失败。`journalctl` 是 systemd 提供的日志查看工具,其功能和可用参数可能因系统版本或发行版不同而有所差异。 ### 检查 `journalctl` 支持的选项 为确认当前环境中 `journalctl` 支持哪些选项,可以使用以下命令: ```bash journalctl --help ``` 该命令会列出所有合法的参数选项及其用法说明。如果某个选项如 `-x` 或 `--xyz` 被提示为“unrecognized option”,则表示当前版本并未实现该参数[^1]。 ### 参数兼容性问题与版本更新 某些较旧版本的 `journalctl` 可能并不支持新版中引入的功能。例如,在某些早期版本中未支持 `--output-fields` 或 `--cursor` 等高级查询功能。如果需要使用新特性,建议升级 systemd 或整个操作系统至更高版本以获取最新功能支持。 ### 参数顺序与语法格式 `journalctl` 对参数顺序有一定要求,部分参数必须放在其他参数之前或之后才能被正确识别。例如: ```bash journalctl -u sshd.service -f ``` 其中 `-f` 表示持续跟踪日志输出,若将 `-f` 放在 `-u` 之前可能导致解析异常。因此确保参数顺序符合手册规定是避免此类错误的重要步骤。 ### 示例:正确使用 `journalctl -xe` 常见的调试命令 `journalctl -xe` 用于显示结构化日志并自动换行处理,便于阅读。如果此命令报错,可尝试分步执行: ```bash journalctl -x journalctl --pager-end ``` 逐一验证每个参数是否有效,有助于定位具体哪个选项不可用[^3]。 ### 替代方案与日志导出 若某些参数确实无法使用但仍需获取详细日志信息,可以通过以下方式替代: - 使用 `--since` 和 `--until` 限定时间范围输出日志 - 将日志导出为文件进行分析: ```bash journalctl --since "1 hour ago" > debug.log ``` 此外,也可以结合 `rsyslog` 或 `logrotate` 配置持久化日志记录机制,减少对 `journalctl` 实时参数的依赖[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值