日志管理与集中化规范 📜
版本:1.0
适用范围:所有生产服务器(RHEL 9.x+、Rocky Linux 9、AlmaLinux 9、Debian Stable、Ubuntu LTS)
1. 核心原则
- 统一存放:应用日志优先存放于
/opt/logs/[应用名]/,避免污染/var/log - 自动轮转:所有日志必须配置 logrotate,防止磁盘写满导致服务异常
- 集中转发:生产环境必须将日志实时或定时转发至集中日志系统
- 保留策略:本地日志保留 30–90 天,集中日志保留 90–365 天(视合规要求)
- 审计日志强保护:
audit.log、/var/log/secure、sshd日志强制保留,不可删除
2. 日志路径与命名规范
结合 naming.md 路径规范,统一日志存放位置:
| 应用 | 路径 |
|---|---|
| 系统日志 | 保持 /var/log/ 原生路径(不修改) |
| Nginx | /opt/logs/nginx/access.log、/opt/logs/nginx/error.log |
| MySQL / MariaDB | /opt/logs/mysql/mysql.log |
| PostgreSQL | /opt/logs/pgsql/postgresql.log |
| 自定义应用 | /opt/logs/[appname]/[service-name].log |
| 审计日志 | /var/log/audit/audit.log(原生路径,不迁移) |
已轮转日志命名:access.log-20260215.gz(logrotate dateext + dateformat -%Y%m%d)
目录提前创建
应用部署时统一创建日志目录并设置正确权限:
mkdir -p /opt/logs/nginx /opt/logs/mysql /opt/logs/myapp
chmod 755 /opt/logs
3. journald 日志限制
防止 systemd journal 无限增长,写入 /etc/systemd/journald.conf:
[Journal]
# 持久化存储(重启后不丢失)
Storage=persistent
# 最大占用磁盘空间
SystemMaxUse=2G
# 至少保留的磁盘空闲空间
SystemKeepFree=4G
# 单个日志文件最大保留时间
MaxFileSec=30day
# 压缩日志
Compress=yes
应用配置:
systemctl restart systemd-journald
# 验证当前占用
journalctl --disk-usage
4. logrotate 配置
4.1 应用日志全局模板
创建 /etc/logrotate.d/opt-app-logs:
/opt/logs/*/*.log {
daily
rotate 30
missingok
dateext
dateformat -%Y%m%d
compress
delaycompress
notifempty
create 0640 root root
sharedscripts
postrotate
# 通知应用进程重新打开日志文件(按需修改 PID 文件路径)
/bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || true
endscript
}
4.2 针对 Nginx 的专用配置
/opt/logs/nginx/*.log {
daily
rotate 30
missingok
dateext
dateformat -%Y%m%d
compress
delaycompress
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
nginx -s reopen
endscript
}
4.3 验证 logrotate 配置
# 检查配置语法(不实际执行)
logrotate -d /etc/logrotate.d/opt-app-logs
# 手动触发一次轮转(测试用)
logrotate -f /etc/logrotate.d/opt-app-logs
# 查看 logrotate timer 状态
systemctl status logrotate.timer
5. 日志集中化方案
| 场景 | 推荐方案 | 实时性 | 复杂度 | 备注 |
|---|---|---|---|---|
| 小规模(< 50 台) | rsyslog → 中央 rsyslog 服务器 | 高 | 低 | 简单可靠,低运维成本 |
| 中大规模 | rsyslog + RELP → Loki / Graylog | 高 | 中 | 支持结构化查询 |
| 容器化环境 | Promtail / Fluent Bit → Loki | 高 | 中 | Kubernetes / Podman 友好 |
| 高合规需求 | auditd + rsyslog → SIEM | 高 | 高 | 满足等保 2.0 三级要求 |
5.1 rsyslog 转发配置
在 /etc/rsyslog.d/99-remote.conf 中添加(使用 TCP 保证可靠传输):
# 转发所有日志到集中服务器(@@ = TCP,@ = UDP)
*.* action(
type="omfwd"
target="log-server.example.com"
port="514"
protocol="tcp"
action.resumeRetryCount="-1"
queue.type="LinkedList"
queue.size="10000"
)
重启并验证:
systemctl restart rsyslog
# 发送测试日志
logger -t linuxdc "Test log from $(hostname) at $(date)"
# 在集中服务器上确认收到
生产建议
使用 TCP(@@)而非 UDP(@)转发,TCP 有重传机制,日志不会因网络抖动而丢失。同时配置 queue.type="LinkedList" 避免集中服务器短暂不可达时日志堆积阻塞 rsyslog。
5.2 Promtail 配置(Loki 客户端)
# /etc/promtail/config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /opt/logs/promtail/positions.yaml
clients:
- url: http://loki.example.com:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets: [localhost]
labels:
job: varlogs
host: linuxdc
__path__: /var/log/*.log
- job_name: applogs
static_configs:
- targets: [localhost]
labels:
job: applogs
host: linuxdc
__path__: /opt/logs/**/*.log
systemctl enable --now promtail
6. 磁盘空间监控
日志目录必须纳入磁盘空间监控,避免写满导致服务异常:
# 查看日志目录当前大小
du -sh /opt/logs/* | sort -rh | head -10
du -sh /var/log/* | sort -rh | head -10
# 快速清理超大日志(紧急情况)
journalctl --vacuum-size=500M
find /opt/logs -name "*.gz" -mtime +60 -delete
建议在 Prometheus 中配置磁盘告警规则(参考第 18 章):当 /opt/logs 或 /var/log 所在分区使用率超过 80% 时触发告警。
7. 检查清单(上线 / 变更必验)
- 所有应用日志存放于
/opt/logs/[应用名]/ - logrotate 配置覆盖所有自定义日志路径(
logrotate -d验证无报错) - journald 大小限制已配置(
SystemMaxUse ≤ 5 GB) - 日志转发已配置并测试:
logger "Test message"后集中服务器可收到 - 磁盘空间监控告警已关联日志目录
- 审计日志(
/var/log/audit/)保留策略符合合规要求(≥ 180 天)
强制要求
生产环境日志必须实现"本地 + 集中"双保险。严禁仅依赖本地存储——服务器故障时本地日志可能同时丢失,集中日志是事后审计和故障溯源的最后防线。