ToolkitX
知识库工具箱

日志分析与管理

syslog, journald, logrotate

25min·进阶

01. 日志在哪——syslog 与 journald

Linux 的日志有两个体系:传统的 syslog(存在 /var/log/ 目录下)和现代的 journald(systemd 自带,存二进制格式)。看日志就像看监控录像,系统干了什么坏事好事都有记录:
bash
# 传统 syslog 日志
tail -f /var/log/syslog         # 系统主日志(Ubuntu/Debian)
tail -f /var/log/messages       # 系统主日志(CentOS/RHEL)
tail -f /var/log/auth.log       # 认证日志(谁登录了、谁输错密码)
tail -f /var/log/kern.log       # 内核日志

# journald(systemd 系统)
journalctl                       # 所有日志
journalctl -f                    # 实时跟踪(等同于 tail -f)
journalctl -u nginx              # 只看 nginx 的日志
journalctl -u nginx --since "1 hour ago"  # 最近一小时的
journalctl -u ssh --since today           # 今天的
journalctl -p err                # 只看错误级别以上
journalctl --disk-usage          # 日志占了多少空间

02. 日志分析技巧

日志不是拿来看的,是拿来分析的。真正排查问题时,你要在海量日志里捞有用信息。grep、awk、sed 在这大显身手:
bash
# 看某个时间段的日志
grep "2026-06-28 10:" /var/log/syslog

# 找登录失败记录
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn

# 统计每个 IP 尝试登录次数(找暴力破解)
grep "Failed password" /var/log/auth.log | grep -oP 'from S+' | sort | uniq -c | sort -rn | head -10

# 找出访问最多的 10 个接口
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 看看哪个时段请求最多
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2,3 | sort | uniq -c | sort -rn

03. logrotate——日志别撑爆硬盘

日志一直写一直写,迟早写满磁盘。logrotate 就是日志的定期保洁——轮转(存档旧的)、压缩、删除过期的。你只管配置好规则,它自动帮你打扫:
bash
# /etc/logrotate.d/nginx 示例配置
/var/log/nginx/*.log {
daily                   # 每天轮转一次
missingok               # 文件不存在也不报错
rotate 30               # 保留最近 30 个归档
compress                # 压缩旧日志
delaycompress           # 延迟压缩(留一天未压缩版本方便排查)
notifempty              # 空文件就不转了
create 640 nginx adm    # 轮转后创建新日志文件
sharedscripts
postrotate
    systemctl reload nginx  # 轮转后通知 nginx 重新打开日志文件
endscript
}

# 手动测试轮转
logrotate -d /etc/logrotate.d/nginx     # 调试模式(不实际执行)
logrotate -f /etc/logrotate.conf        # 强制执行一次
postrotate 里的 reload 很重要——程序一般不自己关闭日志文件,需要通知它重新开。

知识测验

1/4正确 0

journalctl -u nginx 做了什么?

下一节

Shell 脚本编程

下一节