Linux 系统日志怎么查看、分析与轮转?
Linux 日志通常放在哪里?
Linux 排查问题,第一步往往不是重启服务,而是看日志。不同发行版路径略有差异,但大多数传统日志都在 /var/log 下。
常见路径:Debian/Ubuntu 系统综合日志是 /var/log/syslog,认证日志是 /var/log/auth.log;RHEL/CentOS/Rocky 常见 /var/log/messages 和 /var/log/secure。Web 服务日志常见 /var/log/nginx/、/var/log/apache2/ 或 /var/log/httpd/。
很多新系统同时使用 systemd-journald。一部分日志在 /var/log/*.log 里,另一部分可以通过 journalctl 查询。
如何快速查看日志文件?
bashless /var/log/syslog tail -n 100 /var/log/syslog tail -f /var/log/syslog zgrep -i error /var/log/syslog.*.gz
less 适合翻页查看,按 /关键词 搜索;tail -f 适合实时跟踪;压缩日志可以直接用 zgrep,不必先解压。
如何用 grep 分析日志?
bashgrep -i 'error' /var/log/syslog grep -E 'error|failed|timeout|denied' /var/log/syslog grep 'Failed password' /var/log/auth.log grep -i 'timeout' /var/log/syslog | wc -l
如果日志量很大,先缩小范围再搜索。比如先按日期、小时、服务名过滤,再找错误关键词。
journalctl 怎么用?
bashjournalctl -u nginx journalctl -u nginx -n 100 journalctl -u nginx -f journalctl --since '1 hour ago' journalctl -b journalctl -b -1 journalctl -p err journalctl -k
journalctl -u 看服务,-f 实时跟踪,--since 按时间过滤,-b 看当前启动批次,-b -1 看上次启动,-p 按级别过滤,-k 看内核日志。
开启持久化 journal,可创建 /var/log/journal 并配置 /etc/systemd/journald.conf:
ini[Journal] Storage=persistent SystemMaxUse=1G MaxRetentionSec=1month
查看和清理占用:
bashjournalctl --disk-usage journalctl --vacuum-time=14d journalctl --vacuum-size=1G
如何配置 logrotate?
日志不能无限增长。logrotate 用来按时间、大小、保留数量压缩和删除旧日志。
conf/var/log/myapp/*.log { daily rotate 14 missingok notifempty compress delaycompress dateext create 0640 www-data adm sharedscripts postrotate systemctl reload myapp >/dev/null 2>&1 || true endscript }
测试配置:
bashlogrotate -d /etc/logrotate.conf logrotate -f /etc/logrotate.conf
copytruncate 会复制当前日志再截断原文件,不需要 reload 服务,但复制和截断之间可能丢日志。能让服务重新打开日志,就优先用 postrotate;实在做不到,再考虑 copytruncate。
权限、磁盘和结构化日志
日志里可能包含 IP、用户名、请求参数、错误堆栈甚至 token。权限太宽会变成安全问题,权限太严服务又可能写不进去。logrotate 里的 create 0640 user group 很关键。
日志撑满磁盘时,用:
bashdf -h du -sh /var/log/* journalctl --disk-usage lsof | grep deleted
不要直接 rm 正在被进程写入的日志文件,文件名消失了,但进程可能仍持有旧文件句柄,空间不会立刻释放。
JSON 日志可以用 jq 分析:
bashcat app.log | jq 'select(.level == "error")' cat app.log | jq -r '.path' | sort | uniq -c | sort -nr
建议至少包含 timestamp、level、service、trace_id/request_id、message、error 等字段。
远程日志和排查流程
机器多了之后,只靠 SSH 上去 grep 很痛苦。常见做法是用 rsyslog、syslog-ng、Filebeat、Fluent Bit、Vector、Logstash,把日志送到 Elasticsearch、OpenSearch、Loki、ClickHouse 或云厂商日志服务。远程日志要注意时间同步、字段规范和脱敏。
遇到线上问题,可以按这个顺序:确认时间和影响范围;看服务日志;看系统和认证日志;看内核和 OOM;看日志是否还在写入;查轮转和磁盘。不要只盯一个日志文件。把服务日志、系统日志、内核日志、磁盘占用、权限和轮转配置连起来看,问题通常会更快露出头。