2025-02-13
linuxbasic
0
请注意,本文编写于 475 天前,最后修改于 110 天前,其中某些信息可能已经过时。

目录

journalctl 使用指南
基础查看
按时间过滤
按单元过滤
按优先级过滤
按进程/用户过滤
输出控制
组合查询
磁盘管理与维护
高级技巧
配置持久化

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