跳转至

日志管理与集中化规范 📜

版本: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/securesshd 日志强制保留,不可删除

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 天)

强制要求

生产环境日志必须实现"本地 + 集中"双保险。严禁仅依赖本地存储——服务器故障时本地日志可能同时丢失,集中日志是事后审计和故障溯源的最后防线。