日志管理与 journalctl
大约 10 分钟约 2981 字
日志管理与 journalctl
简介
Linux 系统日志是故障排查和系统监控的重要数据源。传统的 syslog 机制将日志写入 /var/log 目录,systemd 引入的 journalctl 提供了更强大的结构化日志查询能力,logrotate 负责日志文件的自动轮转与清理,rsyslog 则实现日志的集中收集与转发。掌握这些工具是运维人员的必备技能。
特点
/var/log 日志目录
常见日志文件
# 系统日志
/var/log/messages # 通用系统日志(CentOS)
/var/log/syslog # 通用系统日志(Ubuntu)
/var/log/auth.log # 认证日志(Ubuntu)
/var/log/secure # 认证日志(CentOS)
/var/log/kern.log # 内核日志
/var/log/boot.log # 启动日志
/var/log/dmesg # 硬件检测日志
# 服务日志
/var/log/nginx/ # Nginx 日志目录
/var/log/mysql/ # MySQL 日志目录
/var/log/docker/ # Docker 日志目录
/var/log/fail2ban.log # Fail2ban 日志
# 日志文件类型
| 日志文件 | 内容 | 用途 |
|---|---|---|
| /var/log/messages | 所有系统消息 | 通用故障排查 |
| /var/log/secure | 认证相关事件 | 安全审计 |
| /var/log/kern.log | 内核消息 | 硬件/驱动问题 |
| /var/log/cron | 定时任务日志 | 任务执行监控 |
| /var/log/boot.log | 系统启动信息 | 启动故障排查 |
| /var/log/wtmp | 登录记录 | 用户登录审计 |日志查看命令
# 实时查看日志(最常用)
tail -f /var/log/messages
tail -f /var/log/nginx/access.log
# 查看最后 100 行
tail -n 100 /var/log/messages
# 查看文件开头
head -n 50 /var/log/syslog
# 搜索关键字
grep "ERROR" /var/log/messages
grep -i "error\|warning" /var/log/syslog
# 按时间段筛选(需日志有时间戳)
awk '/2024-01-15 10:3[0-9]/' /var/log/messages
# 统计错误数量
grep -c "error" /var/log/messages
# 查看二进制登录日志
last -f /var/log/wtmp
lastlog
# 查看失败的登录尝试
lastb
# 查看当前登录用户
who
wjournalctl 日志查询
基本查询
# 查看所有日志
journalctl
# 查看本次启动的日志
journalctl -b
# 查看上一次启动的日志(排查启动故障)
journalctl -b -1
# 查看指定启动序号的日志
journalctl -b -2
# 实时查看日志(类似 tail -f)
journalctl -f
# 查看最后 100 行
journalctl -n 100
# 反向输出(最新在前)
journalctl -r
# 以 JSON 格式输出
journalctl -o json
journalctl -o json-pretty
# 查看日志占用的磁盘空间
journalctl --disk-usage
# 验证日志文件完整性
journalctl --verify按服务与单元查询
# 查看指定服务日志
journalctl -u nginx
journalctl -u docker
journalctl -u sshd
# 查看多个服务的日志
journalctl -u nginx -u php-fpm
# 查看指定服务本次启动的日志
journalctl -u nginx -b
# 实时查看服务日志
journalctl -u nginx -f
# 查看服务最近的日志
journalctl -u nginx -n 50 --no-pager
# 按可执行文件路径查询
journalctl /usr/sbin/sshd
# 按 PID 查询
journalctl _PID=1234
# 按 UID 查询
journalctl _UID=1001
# 按设备查询
journalctl /dev/sda按时间查询
# 查看今天的日志
journalctl --since today
# 查看昨天的日志
journalctl --since yesterday
# 指定时间范围
journalctl --since "2024-01-15 10:00:00" --until "2024-01-15 12:00:00"
# 相对时间
journalctl --since "1 hour ago"
journalctl --since "30 min ago"
journalctl --since "2024-01-15" --until "2024-01-16"
# 查看最近 2 小时的 nginx 日志
journalctl -u nginx --since "2 hours ago"按优先级过滤
# 优先级说明
| 优先级 | 代码 | 含义 |
|---|---|---|
| emerg | 0 | 紧急(系统不可用) |
| alert | 1 | 警报(必须立即处理) |
| crit | 2 | 严重 |
| err | 3 | 错误 |
| warning | 4 | 警告 |
| notice | 5 | 通知 |
| info | 6 | 信息 |
| debug | 7 | 调试 |
# 查看错误及以上级别的日志
journalctl -p err
# 查看警告及以上级别
journalctl -p warning
# 查看指定优先级范围
journalctl -p notice..err
# 查看内核错误日志
journalctl -p err -t kernel高级过滤与输出
# 使用字段过滤(FIELD=VALUE)
journalctl SYSLOG_FACILITY=2 # 内核消息
journalctl _COMM=sshd # SSH 守护进程
journalctl PRIORITY=3 # 错误级别
journalctl _SYSTEMD_UNIT=nginx.service
# 组合过滤
journalctl _SYSTEMD_UNIT=nginx.service PRIORITY=3 --since today
# 使用 grep 风格过滤
journalctl -u nginx | grep "502\|503"
journalctl -u docker | grep -i error
# 输出格式控制
journalctl -o short-precise # 精确时间戳
journalctl -o short-iso # ISO 时间格式
journalctl -o verbose # 详细输出(含所有字段)
journalctl -o cat # 仅显示消息内容
# 仅显示内核日志
journalctl -k
# 显示日志元数据
journalctl -o verbose -n 1journalctl 持久化配置
配置日志持久化
# 创建持久化日志目录
mkdir -p /var/log/journal
# 设置权限
systemd-tmpfiles --create --prefix /var/log/journal
# 重启 systemd-journald
systemctl restart systemd-journald
# 验证持久化配置
journalctl --disk-usage# /etc/systemd/journald.conf — 日志配置
[Journal]
# 存储模式
# volatile: 仅内存(/run/log/journal)
# persistent: 持久化到磁盘(/var/log/journal)
# auto: 如果 /var/log/journal 存在则持久化
Storage=persistent
# 日志最大磁盘空间
SystemMaxUse=2G
SystemKeepFree=500M
SystemMaxFileSize=100M
# 日志最大保留时间
MaxRetentionSec=30day
# 日志最大条目数
LineMax=48K
# 转发配置
ForwardToSyslog=yes
ForwardToKMsg=no
ForwardToConsole=no
ForwardToWall=yes# 应用配置
systemctl restart systemd-journald
# 清理日志(保留最近 7 天)
journalctl --vacuum-time=7d
# 清理日志(限制总大小 500M)
journalctl --vacuum-size=500M
# 清理日志(保留最近 1000 条)
journalctl --vacuum-files=100logrotate 日志轮转
logride 配置
# 全局配置: /etc/logrotate.conf
# 每周轮转
weekly
# 保留 4 周的历史日志
rotate 4
# 创建新的空日志文件
create
# 使用日期作为后缀
dateext
# 压缩旧日志
compress
# 包含子目录配置
include /etc/logrotate.d服务级别日志轮转
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0644 appuser appgroup
size 100M
dateext
dateformat -%Y%m%d
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}logrotate 配置参数说明
| 参数 | 说明 |
|---|---|
| daily/weekly/monthly | 轮转周期 |
| rotate N | 保留 N 份历史日志 |
| compress | 压缩旧日志(gzip) |
| delaycompress | 延迟一次压缩(保留最近一份未压缩) |
| missingok | 日志文件不存在时不报错 |
| notifempty | 空文件不轮转 |
| size 100M | 超过 100MB 时轮转 |
| create | 轮转后创建新文件 |
| dateext | 使用日期作为扩展名 |
| sharedscripts | 多个日志文件共享一次脚本执行 |
| postrotate/endscript | 轮转后执行的命令 |
手动执行 logrotate
# 调试模式(不实际执行)
logrotate -d /etc/logrotate.d/nginx
# 强制执行轮转
logrotate -f /etc/logrotate.d/nginx
# 查看所有轮转配置状态
logrotate -d /etc/logrotate.conf
# 查看轮转历史
cat /var/lib/logrotate/statusrsyslog 日志转发
rsyslog 配置
# /etc/rsyslog.conf
# 加载模块
module(load="imuxsock") # 本地 syslog
module(load="imklog") # 内核日志
module(load="imudp") # UDP 接收
module(load="imtcp") # TCP 接收
# 启用 UDP/TCP 接收(作为日志服务器)
# UDP
$UDPServerRun 514
# TCP
$InputTCPServerRun 514
# 规则示例
| 设备.级别 | 目标 | 说明 |
|---|---|---|
| `*.*` | `/var/log/all.log` | 所有日志 |
| `auth.*` | `/var/log/auth.log` | 认证日志 |
| `kern.*` | `/var/log/kern.log` | 内核日志 |
| `mail.*` | `/var/log/mail.log` | 邮件日志 |
| `*.info` | `/var/log/messages` | 信息级别及以上 |# 转发日志到远程服务器
# 在客户端 /etc/rsyslog.conf 或 /etc/rsyslog.d/remote.conf
# 通过 TCP 转发所有日志
*.* @@log-server.example.com:514
# 通过 UDP 转发(性能更好但不可靠)
# *.* @log-server.example.com:514
# 仅转发特定服务日志
nginx.* @@log-server.example.com:514
# 转发时添加标签
$ActionForwardDefaultTemplate RSYSLOG_TraditionalForwardFormat# 在日志服务器端配置模板(按主机分类存储)
# /etc/rsyslog.d/server.conf
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
# 停止本地匹配(避免重复写入)
& stop
# 重启 rsyslog
systemctl restart rsyslog
# 验证监听端口
ss -tlnp | grep 514
ss -ulnp | grep 514日志分析实战
常用日志分析命令
# Nginx 日志分析
# 统计访问量 Top 10 的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 统计 HTTP 状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 统计请求量 Top 10 的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 查找 5xx 错误
grep " 5[0-9][0-9] " /var/log/nginx/access.log
# 统计每分钟请求量
awk '{print substr($4,2,17)}' /var/log/nginx/access.log | sort | uniq -c
# 查找响应时间超过 1 秒的请求
awk '$NF > 1 {print $0}' /var/log/nginx/access.log
# 安全日志分析
# 统计 SSH 登录失败的 IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10
# 查看成功的 SSH 登录
grep "Accepted" /var/log/secure
# 查看 sudo 执行记录
grep "COMMAND" /var/log/secure
# 系统日志分析
# 查看OOM Killer 记录
grep -i "out of memory\|oom-killer" /var/log/messages
# 查看磁盘 I/O 错误
grep -i "I/O error" /var/log/messages
# 查看服务崩溃重启记录
grep -i "segfault\|killed" /var/log/messages优点
缺点
总结
Linux 日志管理是系统运维的基石。通过 /var/log 目录查看传统日志文件,使用 journalctl 进行多维度的结构化查询,配置 logrotate 自动轮转和清理历史日志,以及利用 rsyslog 实现日志的集中化收集和转发,可以构建完善的日志管理体系。建议在生产环境中持久化 journald 日志、配置合理的 logrotate 策略、将关键日志转发到集中式日志平台(如 ELK),并定期审查日志分析安全事件和系统异常。
关键知识点
- DevOps 主题的核心是让交付更快、更稳、更可审计。
- 自动化不是把命令脚本化,而是把失败、回滚、权限和观测一起设计进去。
- 生产链路必须明确制品、环境、凭据、配置和责任边界。
项目落地视角
- 把流水线拆成构建、测试、制品、部署、验证和回滚几个阶段。
- 为关键步骤补齐日志、指标、通知和人工兜底点。
- 定期演练扩容、回滚、故障注入和灾备切换。
常见误区
- 只关注部署成功,不关注失败恢复和审计追踪。
- 把环境差异藏在临时脚本或人工操作里。
- 上线频率高了以后,没有标准化制品和配置管理。
进阶路线
- 继续补齐 GitOps、可观测性、平台工程和成本治理。
- 把主题和应用架构、安全、权限、备份恢复联动起来理解。
- 形成团队级平台能力,而不是每个项目重复造轮子。
适用场景
- 当你准备把《日志管理与 journalctl》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合构建自动化交付、基础设施治理、监控告警和生产发布体系。
- 当团队规模扩大、发布频率提升或环境变多时,这类主题会显著影响交付效率。
落地建议
- 所有自动化流程尽量做到幂等、可审计、可回滚。
- 把制品、变量、凭据和执行权限分层管理。
- 定期演练扩容、回滚、密钥轮换和灾备恢复。
排错清单
- 先定位失败发生在代码、构建、制品、环境还是权限层。
- 检查流水线变量、凭据、镜像标签和目标环境配置是否一致。
- 如果问题偶发,重点看并发发布、资源争抢和外部依赖抖动。
复盘问题
- 如果把《日志管理与 journalctl》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《日志管理与 journalctl》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《日志管理与 journalctl》最大的收益和代价分别是什么?
