journalctl 使用指南
基础查看
# 查看所有日志(默认从旧到新)
journalctl
# 查看最新日志并持续追踪(类似 tail -f)
journalctl -f
# 查看本次启动后的日志
journalctl -b
# 查看上一次启动的日志(需持久化)
journalctl -b -1
# 查看特定启动的日志(通过索引)
journalctl --list-boots # 列出所有启动记录
journalctl -b -2 # 查看倒数第二次启动
按时间过滤
# 查看最近 5 分钟的日志
journalctl --since "5 minutes ago"
# 查看指定时间段的日志
journalctl --since "2024-01-01 10:00" --until "2024-01-01 12:00"
# 查看昨天的日志
journalctl --since yesterday
# 查看上周一到现在的日志
journalctl --since "2024-01-01" --until "2024-01-07"
# 灵活的时间格式
journalctl --since "2024-01-01 10:00:00"
journalctl --since "10:00" --until "11:00"
journalctl --since "1 hour ago"
journalctl --since "2024-01-01"
按单元过滤
# 查看特定服务日志
journalctl -u nginx.service
journalctl -u ssh
# 查看多个服务
journalctl -u nginx -u mysql -u php-fpm
# 查看当前会话的日志(SSH 登录后)
journalctl _UID=$(id -u)
# 查看内核日志
journalctl -k
# 查看特定挂载单元的日志
journalctl -u home.mount
# 查看 socket 单元
journalctl -u docker.socket
按优先级过滤
# 日志级别:0-7
# 0: emerg 1: alert 2: crit 3: err
# 4: warning 5: notice 6: info 7: debug
# 查看错误及以上级别
journalctl -p err
journalctl -p 3
# 查看警告及以上级别
journalctl -p warning
# 只查看紧急消息
journalctl -p emerg
# 组合使用:查看今天的错误日志
journalctl -p err --since today
按进程/用户过滤
# 查看特定 PID 的日志
journalctl _PID=1234
# 查看特定用户的日志
journalctl _UID=1000
# 查看特定用户的日志(用户名)
journalctl _UID=$(id -u username)
# 查看可执行文件的日志
journalctl /usr/bin/nginx
journalctl /usr/sbin/sshd
# 查看特定会话
journalctl _SES=123
# 组合条件(AND关系)
journalctl _PID=1234 _UID=1000
输出控制
# 显示最后 N 行
journalctl -n 50
journalctl -n 100
# 不进行分页(适合重定向)
journalctl --no-pager
# 输出格式控制
journalctl -o verbose # 详细格式,显示所有字段
journalctl -o json # JSON 格式
journalctl -o json-pretty # 格式化的 JSON
journalctl -o cat # 仅显示消息本身,不包含元数据
journalctl -o short # 默认格式
journalctl -o short-full # 带完整时间戳
journalctl -o short-iso # ISO 8601 时间格式
# 显示特定字段
journalctl -u nginx -o verbose | grep _PID
# 反转输出(最新的在前)
journalctl -r
组合查询
# 场景1:排查 Nginx 今天启动以来的错误
journalctl -u nginx -p err --since today
# 场景2:查看 SSH 登录失败的完整上下文
journalctl _COMM=sshd -p info --since "1 hour ago" | grep -i "failed"
# 场景3:追踪内核错误并高亮
journalctl -k -f -p err | grep --color -i "error\|fail\|warn"
# 场景4:查找特定 IP 的访问记录
journalctl -u nginx | grep "192.168.1.100"
# 场景5:查看最近内存相关错误
journalctl -b -p err | grep -i "memory\|oom\|out of memory"
# 场景6:监控 Docker 容器日志
journalctl -u docker -f
journalctl CONTAINER_NAME=my-container
磁盘管理与维护
# 查看日志占用的磁盘空间
journalctl --disk-usage
# 清理保留 3 天前的日志
journalctl --vacuum-time=3d
# 清理保留最近 1G 的日志
journalctl --vacuum-size=1G
# 保留最近 1000 条日志
journalctl --vacuum-files=1000
# 手动轮转日志
journalctl --rotate
# 查看日志使用统计
journalctl --verify
高级技巧
# 1. 实时监控并触发命令
journalctl -u nginx -f | while read line; do
echo "$line" | grep "error" && /usr/local/bin/alert.sh
done
# 2. 显示字段名帮助查询
# 查看可用字段
journalctl -u ssh -o verbose | grep -E "^[[:space:]]*[A-Z_]+=" | sort -u
# 按特定字段过滤
journalctl _SYSTEMD_UNIT=nginx.service _PID=1234
# 3. 导出特定时间段的日志
journalctl --since "09:00" --until "17:00" -u nginx > nginx_today.log
# 4. 统计错误频率
journalctl -p err --since "7 days ago" | grep -o "^... ... .. ..:..:.." | sort | uniq -c
# 5. 查看特定可执行文件的所有日志
journalctl /usr/bin/python3
# 6. 组合多个匹配条件
# OR 条件(通过 -u 多次指定)
journalctl -u nginx -u mysql -p err
# AND 条件(多个字段)
journalctl _PID=1234 _COMM=nginx
配置持久化
编辑 /etc/systemd/journald.conf
# 持久化存储
Storage=persistent
# 限制最大占用空间
SystemMaxUse=1G
# 单文件最大大小
SystemMaxFileSize=100M
# 日志保留时间
MaxRetentionSec=1month
# 转发到 syslog
ForwardToSyslog=yes
# 压缩日志
Compress=yes
# 重启服务
systemctl restart systemd-journald