Linux 系统日志分析实战教程:/var/log 目录、日志轮转与故障定位
文章目录
在 Linux 服务器运维工作中,系统日志就像 “黑匣子”,记录着系统运行的每一个关键事件 —— 从服务启动失败、用户登录行为到硬件故障告警,几乎所有问题都能在日志中找到线索。掌握日志分析技能,能让运维工程师快速定位故障、排查安全风险、优化系统性能。本文将从基础到实战,详细讲解 /var/log 日志目录、日志轮转机制和关键日志解读方法,全程搭配实操命令和场景案例,新手也能快速上手。
一、深入理解 /var/log:系统日志的 “集中存放地”
Linux 系统遵循 “一切皆文件” 的设计理念,绝大多数日志文件默认存储在/var/log目录下。不同日志文件分工明确,覆盖系统内核、用户认证、服务运行等多个维度,以下是运维中高频使用的核心日志文件及应用场景:
1. 核心日志文件详解(按使用频率排序)
| 日志文件路径 | 适用系统 | 核心功能 | 典型使用场景 |
|---|---|---|---|
| /var/log/messages | 全系统通用 | 系统主日志,记录内核消息、服务启停、全局事件 | 服务器突然重启、系统资源告警、未知故障排查 |
| /var/log/auth.log | Ubuntu/Debian | 用户认证日志,记录 SSH 登录、sudo 操作、密码验证 | 暴力破解排查、权限滥用审计、登录行为追踪 |
| /var/log/secure | CentOS/RHEL | 同 auth.log,CentOS 系列系统的认证日志 | 同上,CentOS 服务器优先查看 |
| /var/log/kern.log | 全系统通用 | 内核专属日志,记录内核模块加载、硬件故障 | 磁盘读写错误、网卡异常、内存兼容性问题 |
| /var/log/boot.log | 全系统通用 | 系统启动日志,记录开机服务启动顺序与结果 | 开机后服务无法启动、启动速度异常 |
| /var/log/dpkg.log | Ubuntu/Debian | 软件包管理日志,记录 apt/dpkg 操作 | 软件安装失败、依赖缺失排查 |
| /var/log/yum.log | CentOS/RHEL | YUM 包管理日志,记录 yum 命令操作 | 同上,CentOS 系统软件安装问题 |
| /var/log/nginx/access.log | 安装 Nginx 的系统 | Web 访问日志,记录用户请求详情 | 网站访问量统计、异常请求识别 |
| /var/log/nginx/error.log | 安装 Nginx 的系统 | Web 错误日志,记录服务配置 / 运行异常 | Nginx 启动失败、页面 500 报错 |
| /var/log/maillog | 安装邮件服务的系统 | 邮件服务日志,记录收发状态 | 邮件发送失败、队列堆积问题 |
2. 日志查看必备基础命令
无需复杂工具,掌握以下几个命令就能满足 80% 的日志查看需求:
-
实时跟踪日志:
tail -f /var/log/messages(动态刷新最新日志,适合排查实时故障,按 Ctrl+C 退出) -
搜索关键字:
grep "Failed" /var/log/auth.log(查找包含 “Failed” 的日志行,可替换为 “error”“warning” 等) -
多关键字筛选:
grep -E "error|warning" /var/log/syslog(同时查找 “error” 和 “warning”) -
按时间范围查找:
grep "2024-06-10 14:" /var/log/secure(查找指定日期 + 小时的日志,需匹配日志时间格式) -
查看日志首尾:
head -n 100 /var/log/boot.log(查看前 100 行,了解启动初期信息)、tail -n 50 /var/log/kern.log(查看最后 50 行,定位最新故障) -
分页查看大日志:
less /var/log/messages(按上下键滚动,输入/关键字搜索,按 Q 退出)
二、日志轮转:避免日志 “撑爆” 磁盘的关键机制
如果日志文件无限制记录,会逐渐占用大量磁盘空间,严重时导致磁盘满额(No space left on device),引发系统故障。日志轮转(logrotate)是 Linux 系统自带的日志管理工具,通过 “分割、压缩、删除” 旧日志,确保日志文件大小可控。
1. 日志轮转的核心逻辑
日志轮转的本质是 “按规则更新日志文件”,核心流程如下:
-
当日志文件达到指定大小(如 100MB)或时间(如 1 天),系统将当前日志重命名(例:
messages→messages.1); -
创建新的空日志文件(
messages)继续记录新事件; -
旧日志按规则压缩(后缀为
.gz)、保留指定份数(如 7 份); -
超出保留份数的旧日志自动删除,释放磁盘空间。
2. 日志轮转的配置文件与参数解析
日志轮转的配置分为 “全局配置” 和 “应用专属配置”,可根据需求自定义规则:
-
全局配置文件:
/etc/logrotate.conf(系统级默认规则,所有日志默认遵循)核心默认参数:
weekly 默认每周轮转一次
rotate 4 默认保留4份旧日志
create 自动创建新日志文件
compress 旧日志自动压缩(.gz格式)
-
应用专属配置目录:
/etc/logrotate.d/(存放 Nginx、SSH、Syslog 等应用的自定义规则,优先级高于全局配置)以 Nginx 日志轮转配置(
/etc/logrotate.d/nginx)为例,解读关键参数:
/var/log/nginx/\*.log { 匹配Nginx的所有日志文件
  daily 每日轮转(覆盖全局weekly规则)
  missingok 日志文件不存在时不报错
  rotate 7 保留7份旧日志(7天后自动删除)
  compress 旧日志压缩
  delaycompress 延迟压缩(只压缩前一天的日志,避免正在写入的日志被压缩)
  notifempty 日志为空时不执行轮转
  create 0640 www-data www-data 新日志权限:所有者www-data,权限640
  sharedscripts 所有日志轮转后只执行一次脚本
  postrotate 轮转后执行的脚本(让Nginx识别新日志)
  if \[ -f /var/run/nginx.pid ]; then
  kill -USR1 \`cat /var/run/nginx.pid\` 发送信号重启Nginx日志进程
  fi
  endscript
}
3. 手动触发日志轮转(实操技巧)
无需等待自动轮转,可通过命令手动执行,适合测试配置或紧急清理日志:
-
执行指定应用的轮转:
logrotate /etc/logrotate.d/nginx -
调试模式(不实际执行,仅查看过程):
logrotate -d /etc/logrotate.d/nginx -
强制轮转(忽略时间 / 大小规则):
logrotate -f /etc/logrotate.d/nginx -
查看全局轮转状态:
logrotate -v /etc/logrotate.conf(-v 显示详细日志)
三、关键日志解读:从日志中快速定位故障
日志解读的核心是 “找关键字 + 对应场景”,以下是运维中最常见的 4 类场景,结合实际日志片段和解决方法,帮你快速上手:
1. 场景 1:SSH 登录失败(暴力破解排查)
日志文件:Ubuntu→/var/log/auth.log;CentOS→/var/log/secure
关键字:Failed password、Authentication failure
日志片段:
Jun 10 09:23:45 localhost sshd\[28916]: Failed password for root from 203.0.113.5 port 34567 ssh2
Jun 10 09:23:48 localhost sshd\[28916]: PAM: Authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.0.113.5
解读:IP 为 203.0.113.5 的主机,尝试用 root 用户登录,密码验证失败,疑似暴力破解。
解决步骤:
-
立即封禁该 IP:
iptables -A INPUT -s ``203.0.113.5`` -j DROP(临时封禁,重启失效); -
长期防护:禁用 root 用户 SSH 登录(修改
/etc/ssh/sshd_config,设置PermitRootLogin no),重启 SSH 服务systemctl restart sshd; -
进阶:安装 fail2ban 工具,自动封禁多次登录失败的 IP。
2. 场景 2:服务启动失败(以 Nginx 为例)
日志文件:/var/log/nginx/error.log 或 /var/log/messages
关键字:failed、emerg、Address already in use
日志片段:
Jun 10 10:15:30 localhost nginx\[30124]: nginx: \[emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
解读:Nginx 启动失败,原因是 80 端口被其他进程占用。
解决步骤:
-
查找占用 80 端口的进程:
netstat -tulpn | grep 80或lsof -i:80; -
停止占用进程(如 Apache):
systemctl stop httpd,或修改 Nginx 端口(编辑/etc/nginx/nginx.conf,将listen 80改为listen 8080); -
重新启动 Nginx:
systemctl start nginx。
3. 场景 3:磁盘空间满额告警
日志文件:/var/log/messages 或 dmesg
关键字:no space left、disk full、EXT4-fs warning
日志片段:
Jun 10 14:30:00 localhost kernel: EXT4-fs warning (device sda1): ext4\_dx\_add\_entry:2366: inode #5678: comm rsync: Directory index full!
解读:/dev/sda1 分区(通常是 / 分区)磁盘空间已满,导致无法写入新文件。
解决步骤:
-
查看磁盘占用情况:
df -h(确认满额分区); -
查找大文件:
du -sh /var/* | sort -rh(优先清理 /var/log 下的旧日志或大文件); -
临时释放空间:删除无用日志
rm -rf /var/log/*.gz,或通过日志轮转清理logrotate -f /etc/logrotate.conf; -
长期优化:扩大磁盘分区,或调整日志轮转规则(如缩短保留时间)。
4. 场景 4:用户权限滥用(sudo 操作审计)
日志文件:/var/log/auth.log 或 /var/log/secure
关键字:sudo、COMMAND=
日志片段:
Jun 10 16:45:22 localhost sudo: testuser : TTY=pts/0 ; PWD=/home/testuser ; USER=root ; COMMAND=/bin/rm -rf /var/tmp/\*
解读:普通用户 testuser 通过 sudo 执行了删除 /var/tmp 目录下所有文件的操作,需确认是否为合法操作。
解决步骤:
-
核实操作合法性:联系 testuser 确认是否为误操作;
-
限制 sudo 权限:编辑
/etc/sudoers文件(建议用visudo命令),移除不必要的用户 sudo 权限; -
开启详细审计:修改 sudo 配置,记录所有 sudo 操作日志(在
/etc/sudoers中添加Defaults logfile="/var/log/sudo.log")。
四、日志分析常见问题与避坑技巧
1. 日志文件为空?
-
原因 1:对应服务未启动(如 Nginx 未启动,access.log 为空);
-
原因 2:日志刚完成轮转,新日志尚未产生事件;
-
解决:启动服务
systemctl start nginx,或手动触发事件(如访问网站生成访问日志)。
2. 日志太多,找不到关键信息?
-
技巧 1:组合筛选命令:
grep "Jun 10" /var/log/messages | grep -E "error|warning"(指定日期 + 关键字); -
技巧 2:按时间范围提取:
sed -n '/Jun 10 09:/,/Jun 10 10:/p' /var/log/secure(提取 9-10 点的日志); -
技巧 3:导出日志分析:
cat /var/log/auth.log > auth_backup.log,用文本编辑器搜索关键字。
3. 日志轮转不生效?
-
原因 1:配置文件语法错误,执行
logrotate -d /etc/logrotate.d/nginx查看调试信息; -
原因 2:日志文件权限不足(logrotate 无法修改),执行
chown root:root /var/log/nginx/*.log调整权限; -
解决:修正配置文件语法,调整日志权限后,执行
logrotate -f /etc/logrotate.d/nginx测试。
更多推荐
所有评论(0)