Linux journalctl 命令
什么是 journalctl?
journalctl 是 Linux 系统中用于查询和显示 systemd 日志的强大工具。作为 systemd 生态系统的一部分,它提供了集中化的日志管理功能,替代了传统的 syslog 服务。
核心特点
- 二进制日志存储:日志以二进制格式存储,提高检索效率
- 结构化日志:支持附加元数据和结构化日志字段
- 实时监控:可以实时跟踪日志变化
- 多种过滤方式:支持按时间、服务、优先级等多种条件过滤
基本语法
journalctl 的基本命令格式如下:
journalctl [选项] [匹配条件...]
常用选项概览
选项 | 说明 |
---|---|
-b |
显示本次启动的日志 |
-f |
跟踪日志(类似 tail -f) |
-k |
只显示内核消息 |
-u |
显示指定单元的日志 |
-n |
显示最近的n条日志 |
--since |
显示指定时间之后的日志 |
--until |
显示指定时间之前的日志 |
常用操作示例
1. 查看完整系统日志
实例
journalctl
2. 查看本次启动的日志
实例
journalctl -b
3. 实时监控新日志
实例
journalctl -f
4. 查看特定服务的日志
实例
journalctl -u nginx.service
5. 按时间范围查询
实例
journalctl --since "2023-01-01 00:00:00" --until "2023-01-02 12:00:00"
6. 查看错误级别的日志
实例
journalctl -p err
日志优先级过滤
journalctl 支持按日志优先级过滤,优先级定义如下:
优先级 | 数值 | 说明 |
---|---|---|
emerg | 0 | 紧急情况 |
alert | 1 | 需要立即处理 |
crit | 2 | 严重错误 |
err | 3 | 一般错误 |
warning | 4 | 警告信息 |
notice | 5 | 需要注意的情况 |
info | 6 | 一般信息 |
debug | 7 | 调试信息 |
使用示例:
实例
# 显示错误及以上级别的日志
journalctl -p err
# 显示警告及以上级别的日志
journalctl -p warning
journalctl -p err
# 显示警告及以上级别的日志
journalctl -p warning
高级用法
1. 显示日志占用的磁盘空间
实例
journalctl --disk-usage
2. 清理旧日志
实例
# 保留最近2天的日志
journalctl --vacuum-time=2d
# 限制日志最大占用500MB
journalctl --vacuum-size=500M
journalctl --vacuum-time=2d
# 限制日志最大占用500MB
journalctl --vacuum-size=500M
3. 以JSON格式输出
实例
journalctl -o json
4. 显示完整的字段信息
实例
journalctl -o verbose
5. 按特定字段过滤
实例
# 显示特定进程ID的日志
journalctl _PID=1234
# 显示特定用户的日志
journalctl _UID=1000
journalctl _PID=1234
# 显示特定用户的日志
journalctl _UID=1000
实用技巧
1. 组合查询
实例
# 查询nginx服务从昨天开始的错误日志
journalctl -u nginx.service --since yesterday -p err
journalctl -u nginx.service --since yesterday -p err
2. 分页查看
实例
journalctl | less
3. 导出日志到文件
实例
journalctl --since "2023-01-01" > journal.log
4. 查看内核环缓冲区消息
实例
journalctl -k
5. 查看系统启动过程日志
实例
journalctl -b0 | grep "Starting"
常见问题解决
问题1:日志显示不完整
解决方案:
实例
# 增加输出行数限制
journalctl --no-pager
journalctl --no-pager
问题2:如何查看被轮转的旧日志?
解决方案:
实例
# 查看所有日志(包括归档的)
journalctl -a
journalctl -a
问题3:如何查看特定时间点的日志?
解决方案:
实例
# 精确到秒的时间查询
journalctl --since "2023-01-01 12:00:00" --until "2023-01-01 12:05:00"
journalctl --since "2023-01-01 12:00:00" --until "2023-01-01 12:05:00"
点我分享笔记