🐧 第09章 · 日志管理
journalctl /var/log logrotate
日志管理¶
这一章讲日志从哪来、怎么看、怎么管、怎么不被日志撑爆磁盘。生产服务器的故障排查一大半靠日志。掌握 journalctl + /var/log + logrotate 这套,就能快速定位问题、又能保证日志不会把磁盘写满。
日志从哪里来¶
Linux 日志分两大类:
- systemd journal(二进制,
journalctl读取):systemd 管理的所有服务、内核日志都进这里。本机每个 systemd 服务(nginx/mysql/bangdream/xray 等)的日志都能在 journalctl 里按服务过滤。 - /var/log 文本日志:传统服务仍然写文本文件。常见的有:
-
/var/log/syslog系统全局日志 -/var/log/auth.log认证/登录日志 -/var/log/nginx/access.log、error.lognginx(本机按站点分开,如bangdream.access.log) -/var/log/mysql/MySQL 日志 - 业务自定义日志:本机 cron 脚本写/var/log/tieba_sign.log、/var/log/monitor_report.log
journalctl:一站式查看服务日志¶
journald 把日志统一收起来,按服务、时间、级别过滤,是排查利器:
# 看某个服务的全部日志
journalctl -u nginx
# 只看最近 5 分钟
journalctl -u nginx --since "5 minutes ago"
# 跟随实时输出(c 命令 Ctrl+C 退出)
journalctl -u bangdream -f
# 只看错误及以上级别
journalctl -u mysql -p err
# 看开机日志
journalctl -b
# 看内核日志
journalctl -k
提示 | 某些 systemd 服务(如 nginx)同时写 journal 和
/var/log。两边都看更保险;用journalctl -u <服务> -f实时盯某个服务是否起得来、有没有报错。
排查实际流程(例:服务起不来)¶
# 1) 服务什么状态
systemctl status bangdream
# 2) 最近日志
journalctl -u bangdream -n 50
# 3) 错误级别日志
journalctl -u bangdream -p err --since today
# 4) 结合起来:重启后立刻看
journalctl -u bangdream -b -n 30
logrotate:防止日志撑爆磁盘¶
日志一直写会越来越大,最终把磁盘写满导致服务崩溃。logrotate 负责轮转:到一定大小/时间就把旧日志压缩归档,保留若干份。
配置在 /etc/logrotate.conf(全局)与 /etc/logrotate.d/*(每个服务的规则)。系统自带的 cron 里就有 logrotate 每天跑一次。
给自定义日志加 logrotate 规则¶
以本机 cron 脚本 /var/log/tieba_sign.log 为例,建 /etc/logrotate.d/tieba:
/var/log/tieba_sign.log {
weekly # 每周轮转
rotate 4 # 保留 4 份
compress # 压缩成 .gz
missingok # 文件不存在不报错
notifempty # 空文件不轮转
copytruncate # 复制后清空原文件(适合持续写入的日志)
}
注意 |
copytruncate适合不能停服务重开日志的场景(对持续写入的应用很实用),但它有一个极小的时间窗口可能丢一两条日志。能用create/postrotate重启服务的方式更严谨。
查看与统计日志文件¶
# 查看文件头尾、实时跟随、带行号
tail -f /var/log/nginx/learn.access.log
tail -n 100 /var/log/monitor_report.log
# 统计某一天的访问数
grep -c "GET " /var/log/nginx/learn.access.log
# top 10 个访问最多的 IP
awk '{print $1}' /var/log/nginx/learn.access.log | sort | uniq -c | sort -rn | head
磁盘占用检查¶
# 找个占用日志最大的
du -sh /var/log/* | sort -rh | head
# 看磁盘整体
df -h
注意 | 日志目录
/var/log满会导致服务异常。建议把日志单独放在空间大的分区,或加大轮转频率。发现某日志暴涨要先查明为什么(是不是被刷屏/有 bug)。
相关命令¶
journalctl --disk-usage看 journal 占用;journalctl --vacuum-time=14d清理旧日志。tail -F(大写)比-f更稳,日志文件被轮转重开后还能继续跟。logrotate -d /etc/logrotate.conf干跑模拟,logrotate -f强制执行一次。