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 -rn03. 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 脚本编程