Skip to content

13. 系统监控与日志

13.1 系统性能监控

bash
# vmstat — 虚拟内存统计(每2秒刷新)
vmstat 2 5

# iostat — IO 统计(需安装 sysstat)
iostat -xz 2 3

# sar — 系统活动报告(需安装 sysstat)
sar -u 1 5         # CPU 使用率
sar -r 1 5         # 内存使用率
sar -b 1 5         # IO 统计

# uptime — 系统负载
uptime

# dmesg — 内核消息
dmesg | tail -20
dmesg | grep -i error
bash
$ vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs  us sy id wa st
 1  0 247808 156340  23456 999232    0    0     2    15   89  156   5  1 93  1  0
 0  0 247808 155216  23456 1000356   0    0     0    42  102  178   3  1 96  0  0
 2  0 247808 154092  23456 1001480   0    0     0    28   95  168   4  1 95  0  0

$ uptime
 10:30:45 up 15:23,  2 users,  load average: 0.52, 0.48, 0.35

# load average 含义:1分钟/5分钟/15分钟的平均负载
# 对于 8 核 CPU,负载 0.52 表示系统非常空闲

13.2 日志系统

Linux 的日志是排错的金矿。大多数日志保存在 /var/log/ 目录。

日志文件内容
/var/log/syslog(Debian)系统综合日志
/var/log/messages(RHEL)系统综合日志
/var/log/auth.log认证日志(登录、sudo)
/var/log/kern.log内核日志
/var/log/dmesg硬件检测日志
/var/log/apt/APT 包管理日志
/var/log/nginx/Nginx 访问和错误日志
/var/log/mysql/MySQL 日志
bash
# 实时查看系统日志
tail -f /var/log/syslog

# 搜索登录失败
grep "Failed password" /var/log/auth.log

# 查看 SSH 登录记录
journalctl -u ssh --since today

# 查看最近的内核错误
dmesg | grep -i "error\|fail" | tail -10

# 查看某个时间段的日志
grep "Jun 20 10:" /var/log/syslog | head -20
bash
$ grep "Failed password" /var/log/auth.log | tail -5
Jun 20 08:15:23 server sshd[5678]: Failed password for invalid user admin from 45.33.32.156 port 48312 ssh2
Jun 20 08:15:25 server sshd[5678]: Failed password for invalid user admin from 45.33.32.156 port 48312 ssh2
Jun 20 09:22:14 server sshd[6789]: Failed password for root from 104.236.228.48 port 37216 ssh2
Jun 20 09:22:16 server sshd[6789]: Failed password for root from 104.236.228.48 port 37216 ssh2
Jun 20 10:05:30 server sshd[7890]: Failed password for invalid user test from 185.143.223.67 port 54512 ssh2

⚠️ 注意: ⚠️ 安全提示:如果你看到大量 "Failed password" 来自陌生 IP,说明服务器正在被暴力破解。立即安装fail2ban来阻止这些攻击。

13.3 logrotate — 日志轮转

日志文件会不断增长,logrotate 负责自动压缩、轮转和删除旧日志。

bash
# 查看 logrotate 配置
cat /etc/logrotate.conf

# 查看特定应用的配置
cat /etc/logrotate.d/nginx

# 手动测试(不实际执行)
sudo logrotate -d /etc/logrotate.d/nginx

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

Nginx 日志轮转配置示例

bash
/var/log/nginx/*.log {
    daily                   # 每天轮转
    missingok               # 日志不存在时不报错
    rotate 14               # 保留 14 个备份
    compress                # 压缩旧日志
    delaycompress           # 延迟一轮压缩
    notifempty              # 空日志不轮转
    create 0640 www-data adm # 新日志的权限
    sharedscripts           # 所有日志轮转后只执行一次脚本
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
    endscript
}