6月21日 21:41

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 查询。

如何快速查看日志文件?

bash
less /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 分析日志?

bash
grep -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 怎么用?

bash
journalctl -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

查看和清理占用:

bash
journalctl --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 }

测试配置:

bash
logrotate -d /etc/logrotate.conf logrotate -f /etc/logrotate.conf

copytruncate 会复制当前日志再截断原文件,不需要 reload 服务,但复制和截断之间可能丢日志。能让服务重新打开日志,就优先用 postrotate;实在做不到,再考虑 copytruncate

权限、磁盘和结构化日志

日志里可能包含 IP、用户名、请求参数、错误堆栈甚至 token。权限太宽会变成安全问题,权限太严服务又可能写不进去。logrotate 里的 create 0640 user group 很关键。

日志撑满磁盘时,用:

bash
df -h du -sh /var/log/* journalctl --disk-usage lsof | grep deleted

不要直接 rm 正在被进程写入的日志文件,文件名消失了,但进程可能仍持有旧文件句柄,空间不会立刻释放。

JSON 日志可以用 jq 分析:

bash
cat 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;看日志是否还在写入;查轮转和磁盘。不要只盯一个日志文件。把服务日志、系统日志、内核日志、磁盘占用、权限和轮转配置连起来看,问题通常会更快露出头。

标签:Linux