Linux 日志管理与 logrotate 配置完全指南
日志是 Linux 系统的”黑匣子”,记录了系统运行、应用行为和错误事件的详细信息。合理的日志管理不仅能帮助你快速定位问题,还能有效控制磁盘空间,避免日志文件无限膨胀导致磁盘爆满。本文将全面介绍 Linux 日志管理的基础知识、日志系统的演化,以及 logrotate 工具的详细配置方法。
一、Linux 日志系统概述
1.1 日志存储位置
Linux 系统日志通常存储在 /var/log/ 目录下,常见的日志文件包括:
| 日志文件 | 用途 |
|---|---|
/var/log/syslog 或 /var/log/messages |
系统综合日志 |
/var/log/auth.log 或 /var/log/secure |
认证与安全日志 |
/var/log/kern.log |
内核日志 |
/var/log/dmesg |
内核环缓冲区消息 |
/var/log/boot.log |
系统启动日志 |
/var/log/nginx/ |
Nginx 访问与错误日志 |
/var/log/mysql/ |
MySQL/MariaDB 日志 |
/var/log/redis/ |
Redis 日志 |
说明:Debian/Ubuntu 系列使用
syslog和auth.log,而 RHEL/CentOS 系列使用messages和secure。
1.2 日志系统的演化
Linux 日志系统经历了三个阶段:
- syslogd:传统的系统日志守护进程,功能简单
- rsyslog:增强版 syslog,支持 TCP、TLS、数据库输出、模块化扩展(当前主流)
- systemd-journald:systemd 自带的日志系统,二进制格式,支持结构化元数据
目前大多数现代 Linux 发行版同时运行 rsyslog 和 systemd-journald,两者协同工作。
二、systemd-journald 的使用
2.1 基本查询
journalctl 是查看 systemd-journald 日志的核心命令:
1 | # 查看所有日志(默认显示在 pager 中) |
2.2 日志持久化配置
默认情况下,systemd-journald 将日志存储在内存中(/run/log/journal),重启后丢失。如需持久化存储:
1 | # 创建持久化存储目录 |
持久化配置文件 /etc/systemd/journald.conf 关键参数:
1 | [Journal] |
三、rsyslog 配置
rsyslog 是大多数 Linux 发行版默认的日志记录守护进程。
3.1 配置文件结构
rsyslog 的配置位于 /etc/rsyslog.conf 和 /etc/rsyslog.d/ 目录下:
1 | # 查看主配置文件 |
3.2 配置语法
rsyslog 配置文件由选择器(selector)和动作(action)组成:
1 | # 格式:设施.优先级 动作 |
- 设施(Facility):
auth,authpriv,cron,daemon,kern,lpr,mail,news,syslog,user,uucp,local0~`local7` - 优先级(Priority):
debug,info,notice,warning,err,crit,alert,emerg - 动作(Action):日志文件路径、远程服务器、数据库等
3.3 常见配置示例
1 | # 将所有 info 及以上级别的日志记录到指定文件,排除 mail/auth/authpriv/cron |
四、logrotate 日志轮转配置
4.1 logrotate 工作原理
logrotate 是 Linux 系统自带的日志轮转工具,用于自动压缩、轮转、删除旧日志文件。它通过 cron 定时任务触发,默认每天运行一次。
logrotate 的工作流程:
- 根据配置文件判断是否需要轮转
- 将当前日志文件重命名(如
syslog→syslog.1) - 通知进程重新创建日志文件(通过 postrotate 脚本)
- 压缩旧日志(可选)
- 删除超过保留期限的日志
4.2 主配置文件
1 | /etc/logrotate.conf # 主配置文件 |
查看默认配置:
1 | cat /etc/logrotate.conf |
典型输出:
1 | weekly # 每周轮转一次 |
4.3 配置指令详解
| 指令 | 说明 | 示例 |
|---|---|---|
daily / weekly / monthly |
轮转周期 | daily |
rotate N |
保留 N 份旧日志 | rotate 30 |
size SIZE |
日志达到指定大小触发轮转 | size 100M |
compress / nocompress |
是否压缩旧日志 | compress |
delaycompress |
延迟压缩一次(保留一个未压缩版本) | delaycompress |
dateext |
使用日期作为后缀 | dateext |
dateformat -%Y%m%d |
日期格式 | dateformat -%Y%m%d |
create [权限] [用户] [组] |
轮转后创建新日志 | create 640 syslog adm |
missingok |
日志文件不存在时不报错 | missingok |
notifempty |
日志为空时不轮转 | notifempty |
sharedscripts |
多个日志文件共享一个 postrotate 脚本 | sharedscripts |
postrotate / endscript |
轮转后执行的脚本 | 见下方示例 |
prerotate / endscript |
轮转前执行的脚本 | 见下方示例 |
maxage N |
删除超过 N 天的日志 | maxage 30 |
maxsize SIZE |
日志超过此大小立即轮转(即使不到周期) | maxsize 200M |
minsize SIZE |
日志超过此大小且到达周期才轮转 | minsize 100M |
olddir DIR |
将旧日志移动到指定目录 | olddir /var/log/archive |
4.4 常用配置示例
Nginx 日志轮转
1 | # /etc/logrotate.d/nginx |
MariaDB/MySQL 慢查询日志
1 | # /etc/logrotate.d/mariadb-slow |
systemd-journald 配合 logrotate
1 | # /etc/logrotate.d/journald |
4.5 手动测试与调试
1 | # 强制轮转特定日志(调试模式) |
4.6 logrotate 状态文件
logrotate 的状态记录在 /var/lib/logrotate/status 或 /var/lib/logrotate/logrotate.status 中。
1 | # 查看各日志最后轮转时间 |
如果某条日志轮转未如期执行,可以检查状态文件确认上次轮转时间。
五、日志查看与分析工具
5.1 基础命令
1 | # 查看日志尾部(实时跟踪) |
5.2 日志分析实战
场景:分析 Nginx 访问日志,找出访问量最高的 IP
1 | # 统计访问量 TOP 10 的 IP |
场景:分析系统错误日志
1 | # 统计各类错误出现次数 |
六、日志安全最佳实践
6.1 权限配置
1 | # 确保日志目录权限安全 |
6.2 集中式日志管理
生产环境中建议使用集中式日志管理方案:
| 方案 | 特点 | 适用场景 |
|---|---|---|
| ELK/EFK Stack | Elasticsearch + Logstash/Fluentd + Kibana | 大规模集群,需要可视化分析 |
| Loki + Promtail + Grafana | 轻量级,与 Prometheus 集成 | Kubernetes 环境 |
| Graylog | 开源的集中日志管理平台 | 企业级日志管理 |
| Rsyslog 远程转发 | 简单,无需额外组件 | 小型集群 |
6.3 Rsyslog 远程日志转发配置
客户端配置(发送日志):
1 | # /etc/rsyslog.d/remote.conf |
服务端配置(接收日志):
1 | # /etc/rsyslog.conf |
6.4 日志监控告警
结合 Prometheus + Alertmanager 实现日志监控告警:
1 | # 使用 mtail 提取日志指标 |
七、常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 日志文件过大导致磁盘占满 | logrotate 未配置或配置不当 | 检查 /etc/logrotate.d/ 中各应用配置,添加 size 限制 |
| logrotate 未按时执行 | cron 服务未运行或配置错误 | sudo systemctl status cron,检查 /etc/cron.daily/logrotate |
| 日志轮转后应用不写新日志 | 未正确配置 postrotate 信号 | 添加正确的信号发送:kill -USR1 $(cat /var/run/nginx.pid) |
| journalctl 日志占用过大 | SystemMaxUse 未设置或过大 | 配置 SystemMaxUse=500M 并执行 journalctl --vacuum-size=500M |
| 轮转后的日志权限不正确 | create 参数缺失或错误 | 添加 create 640 syslog adm 到 logrotate 配置 |
| Nginx 日志轮转后空白页面 | USR1 信号未成功发送 | 确保 nginx.pid 文件存在,使用 sharedscripts 避免重复发送 |
八、一键清理脚本
以下是一个实用的一键脚本,用于快速清理和配置日志管理:
1 |
|
保存为 /usr/local/bin/log-management.sh 并赋予执行权限:
1 | sudo chmod +x /usr/local/bin/log-management.sh |
九、总结
合理的日志管理是服务器运维的基础工作,核心要点如下:
- 理解日志体系:rsyslog 负责日志记录,logrotate 负责日志轮转,systemd-journald 提供结构化日志查询
- 配置 logrotate:为各应用配置合理的轮转策略(周期、保留份数、压缩、权限)
- 定期监控:使用
journalctl和tail/grep/awk定期检查日志,及时发现异常 - 集中管理:多服务器环境建议使用集中式日志管理方案
- 安全加固:控制日志权限,避免敏感信息泄露
每次配置修改后,务必用 logrotate -vf 测试,确认轮转行为符合预期。
本文由AI辅助生成,内容仅供参考
- 标题: Linux 日志管理与 logrotate 配置完全指南
- 作者: Someone
- 创建于 : 2026-06-09 11:03:00
- 更新于 : 2026-06-18 08:39:57
- 链接: https://demo-blog.qusite.cn/2026-06-09-linux-log-management-guide/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。