systemd的journalctl是我排查问题时最常用的工具之一。它比传统syslog强在结构化、二进制存储、自动轮转。但很多人只会journalctl -xe,这远远不够。下面直接说几个高效用法。
基础过滤
查当前启动的日志,加-b。不加-b会从最早记录开始,机器跑几个月的话输出量巨大。
journalctl -b
查上一次启动的日志,用-b -1。想往前数第几次就写负数。
journalctl -b -1
按时间范围过滤。–since和–until支持”yesterday””today””-1h”这类自然语言。
journalctl --since "1 hour ago"
journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 00:00:00"
按单元过滤
查某个服务的日志,-u参数。可以同时查多个,用多个-u。
journalctl -u nginx.service
journalctl -u nginx.service -u sshd.service
查某个服务当前启动的日志,组合-b。
journalctl -b -u mysqld.service
按优先级过滤
-p后面跟优先级数字或名称。0 emerg,1 alert,2 crit,3 err,4 warning,5 notice,6 info,7 debug。
只查错误及以上级别。
journalctl -p err -b
查warning及以上。
journalctl -p warning -b
按字段精确过滤
journalctl支持结构化查询。常用字段有_PID、_COMM、_EXE、_SYSTEMD_UNIT、_HOSTNAME。字段名可以用journalctl -o verbose看。
查某个PID的日志。
journalctl _PID=1234
查某个可执行文件产生的日志。
journalctl _EXE=/usr/bin/nginx
查某个用户产生的日志。
journalctl _UID=1000
多个字段用空格分隔,是AND关系。
journalctl _PID=1234 _COMM=nginx
输出格式控制
默认输出是syslog风格。想看清字段结构用-o verbose。
journalctl -u nginx -o verbose
只输出消息体,不要时间戳主机名这些。
journalctl -u nginx -o cat
输出JSON,方便脚本解析。
journalctl -u nginx -o json
实时跟踪
跟tail -f一样,用-f。
journalctl -u nginx -f
磁盘占用与清理
查看当前日志占了多少磁盘。
journalctl --disk-usage
清理日志。保留最近2天。
journalctl --vacuum-time=2d
限制日志文件总大小不超过500M。
journalctl --vacuum-size=500M
清理到只剩最近100M的日志。
journalctl --vacuum-size=100M
远程查看
如果有多台机器,可以用系统d-journal-remote收集到中央服务器。但实际场景里,我更喜欢把关键服务的日志直接推到集中式日志平台。比如在雨云上部署的实例,我会用rsyslog转发到日志服务器。雨云的机器网络稳定,带宽够用,转发日志基本不丢包,配合journalctl本地临时查,远程查用ELK,两层保险。
几个实战组合
查某个服务最近5分钟的error。
journalctl -u api.service --since "5 min ago" -p err
查某个进程的完整生命周期日志,从启动到崩溃。
journalctl _PID=$(systemctl show -p MainPID nginx.service | cut -d= -f2)
查某个内核错误。
journalctl -k -p err
查所有服务启动失败的记录。
journalctl -b --no-pager | grep "Failed to start"
小技巧
默认输出会走less分页。如果机器日志量很大,加–no-pager直接打印。
journalctl -u nginx --no-pager
想查看日志里某个字段的所有可能值,用-F。
journalctl -F _SYSTEMD_UNIT
日志文件默认在/var/log/journal/。如果这个目录不存在,日志只会存在内存里,重启就丢。手动创建目录并设置权限可以持久化。
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
journalctl排查问题时,核心思路是先缩小范围:先看是哪个单元,再看什么时间,看什么级别。不要上来就journalctl不带参数,那等于大海捞针。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容