journalctl是systemd日志系统的查询工具。当你某个服务启动失败或出现错误时,系统会提示你使用这个工具来排查。
使用grep、awk这类工具对日志进行处理时,可能遇到下面的情况导致排查困难。
- 日志文件太大,grep半天没反应
- 想看某个时间段的日志,结果要写一堆复杂的正则表达式
- 系统重启后,之前的日志找不到了
- 想看某个服务的完整日志链路,结果要翻好几个不同的文件
基础用法
直接使用journalctl命令,会看到系统从启动开始的所有日志。不过这样看起来会很乱,而且信息量巨大。
加个-f参数,就像tail -f一样,可以实时显示最新的日志。当怀疑某个服务有问题的时候,开着这个命令,然后去操作一下,立马就能看到相关的日志输出。
按时间查看日志
#查看今天的日志
journalctl --since today
#或者看昨天的:
journalctl --since yesterday
#看某个时间段的
journalctl --since "2024-01-15 14:00:00" --until "2024-01-15 15:00:00"按服务查看日志
#只看nginx服务的日志
journalctl -u nginx
#实时监控某个服务:
journalctl -u nginx -f
#有时候一个服务重启了好几次,你想看它的历史记录:
journalctl -u nginx --since "1 hour ago"进阶技巧
按优先级过滤
#只显示错误级别的日志
journalctl -p err查看内核日志
journalctl -k该命令等同于dmesg,但是journalctl的输出格式更友好,而且可以结合其他参数使用。
按进程ID查看
有时候你知道某个进程有问题,可以直接按PID查看:
journalctl _PID=1234查看启动信息
想看系统启动过程中发生了什么:
journalctl -b如果系统重启过多次,你想看上一次启动的日志:
journalctl -b -1这个功能在排查系统启动异常时特别有用。
高级功能
JSON格式输出
有时候你需要程序化处理日志,可以用JSON格式:
journalctl -u nginx -o json这样输出的每一行都是一个JSON对象,方便后续处理。
查看磁盘使用情况
journal日志会占用磁盘空间,你可以查看当前使用情况:
journalctl --disk-usage如果空间不够,可以清理旧日志:
journalctl --vacuum-time=7d只保留最近7天的日志。
导出日志
有时候需要把日志发给其他人分析:
journalctl -u myapp --since today > app_logs.txt反向查看日志
从最新的日志开始看:
journalctl -r这个在查看最近发生的问题时很有用。
配置优化
持久化存储
默认情况下,有些系统的journal日志是存储在内存中的,重启后就丢失了。要启用持久化存储:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald限制日志大小
编辑/etc/systemd/journald.conf:
SystemMaxUse=1G
SystemMaxFileSize=100M这样可以避免日志占用太多磁盘空间。
常见问题和解决方案
日志查看权限问题
有时候普通用户看不到某些日志,需要加入systemd-journal组:
sudo usermod -a -G systemd-journal username日志时间显示问题
如果时间显示不对,可能是时区设置问题:
journalctl --utc使用UTC时间显示。
性能问题
如果journalctl查询很慢,可能是因为日志文件太大。可以考虑:
- 清理旧日志
- 调整日志级别
- 使用更精确的过滤条件
一些小技巧
# 查看最近的错误日志,按时间倒序
journalctl -p err -r --since "1 hour ago"
# 查看某个用户的所有日志
journalctl _UID=1000
# 查看系统启动耗时
systemd-analyze blame
评论 (0)