为什么需要日志监控

服务器日志记录了系统中发生的一切——正常请求、错误、安全事件、性能问题。定期检查日志可以:

  • 快速定位故障 — 网站挂了?先看日志
  • 发现安全威胁 — 检测暴力破解、异常登录
  • 性能分析 — 找出慢查询和瓶颈
  • 合规要求 — 保留审计日志

Linux 系统日志

主要日志文件

日志文件 用途 查看命令
/var/log/syslog 系统综合日志(Ubuntu/Debian) tail -f /var/log/syslog
/var/log/messages 系统综合日志(CentOS/RHEL) tail -f /var/log/messages
/var/log/auth.log 认证和登录日志 tail -f /var/log/auth.log
/var/log/nginx/access.log Nginx 访问日志 tail -f /var/log/nginx/access.log
/var/log/nginx/error.log Nginx 错误日志 tail -f /var/log/nginx/error.log
/var/log/mysql/error.log MySQL 错误日志 tail -f /var/log/mysql/error.log
/var/log/dpkg.log 软件包安装日志 less /var/log/dpkg.log

使用 journalctl

现代 Linux 系统使用 systemd-journald 管理日志:

# 查看所有日志
journalctl

# 查看最近 30 分钟的日志
journalctl --since "30 min ago"

# 查看某个服务的日志
journalctl -u nginx
journalctl -u ssh
journalctl -u docker

# 实时追踪日志
journalctl -f

# 查看错误级别以上的日志
journalctl -p err

# 查看昨天的日志
journalctl --since yesterday --until today

实时日志监控

tail 命令

# 实时查看 Nginx 访问日志
tail -f /var/log/nginx/access.log

# 显示最后 100 行并追踪
tail -100f /var/log/nginx/error.log

# 查看多个日志文件
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

日志过滤与统计

# 统计 5xx 错误数量
grep 'HTTP/1.1" [5]..' /var/log/nginx/access.log | wc -l

# 查找访问量最大的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 查找请求最多的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 查找特定时间段的日志
awk '/12\/Jul\/2026:14:00/,/12\/Jul\/2026:15:00/' /var/log/nginx/access.log

实时监控脚本

#!/bin/bash
# monitor-errors.sh — 实时监控错误并通知

ALERT_EMAIL="[email protected]"
ERROR_PATTERNS="(PHP Fatal error|ERROR|FATAL|Out of memory)"

tail -f /var/log/nginx/error.log | while read line; do
    if echo "$line" | grep -qE "$ERROR_PATTERNS"; then
        echo "$line" | mail -s "Server Error Alert" $ALERT_EMAIL
        echo "[ALERT] $line"
    fi
done

日志轮转(Log Rotation)

logrotate 配置

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

手动执行

# 强制轮转
sudo logrotate -f /etc/logrotate.d/nginx

# 测试配置
sudo logrotate -d /etc/logrotate.d/nginx

日志分析工具

工具 类型 用途
grep / awk / sed 命令行 快速过滤和分析
goaccess 终端/Web Nginx 日志实时分析
lnav 终端 增强型日志查看器
ngxtop 终端 Nginx 访问统计
ELK Stack 服务 企业级日志分析和搜索

安全注意事项

  1. 日志中包含敏感信息(IP、路径、可能的数据),注意访问权限
  2. 日志文件设置为 640 权限,只允许所有者和管理员读取
  3. 定期备份重要日志
  4. 配置日志轮转防止磁盘写满
  5. 考虑集中式日志管理(多台服务器时)