在 Linux 服务器运维工作中,系统日志就像 “黑匣子”,记录着系统运行的每一个关键事件 —— 从服务启动失败、用户登录行为到硬件故障告警,几乎所有问题都能在日志中找到线索。掌握日志分析技能,能让运维工程师快速定位故障、排查安全风险、优化系统性能。本文将从基础到实战,详细讲解 /var/log 日志目录、日志轮转机制和关键日志解读方法,全程搭配实操命令和场景案例,新手也能快速上手。

一、深入理解 /var/log:系统日志的 “集中存放地”

Linux 系统遵循 “一切皆文件” 的设计理念,绝大多数日志文件默认存储在/var/log目录下。不同日志文件分工明确,覆盖系统内核、用户认证、服务运行等多个维度,以下是运维中高频使用的核心日志文件及应用场景:

1. 核心日志文件详解(按使用频率排序)

日志文件路径适用系统核心功能典型使用场景
/var/log/messages全系统通用系统主日志,记录内核消息、服务启停、全局事件服务器突然重启、系统资源告警、未知故障排查
/var/log/auth.logUbuntu/Debian用户认证日志,记录 SSH 登录、sudo 操作、密码验证暴力破解排查、权限滥用审计、登录行为追踪
/var/log/secureCentOS/RHEL同 auth.log,CentOS 系列系统的认证日志同上,CentOS 服务器优先查看
/var/log/kern.log全系统通用内核专属日志,记录内核模块加载、硬件故障磁盘读写错误、网卡异常、内存兼容性问题
/var/log/boot.log全系统通用系统启动日志,记录开机服务启动顺序与结果开机后服务无法启动、启动速度异常
/var/log/dpkg.logUbuntu/Debian软件包管理日志,记录 apt/dpkg 操作软件安装失败、依赖缺失排查
/var/log/yum.logCentOS/RHELYUM 包管理日志,记录 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. 日志轮转的核心逻辑

日志轮转的本质是 “按规则更新日志文件”,核心流程如下:

  1. 当日志文件达到指定大小(如 100MB)或时间(如 1 天),系统将当前日志重命名(例:messagesmessages.1);

  2. 创建新的空日志文件(messages)继续记录新事件;

  3. 旧日志按规则压缩(后缀为.gz)、保留指定份数(如 7 份);

  4. 超出保留份数的旧日志自动删除,释放磁盘空间。

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 passwordAuthentication 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 用户登录,密码验证失败,疑似暴力破解。

解决步骤

  1. 立即封禁该 IP:iptables -A INPUT -s ``203.0.113.5`` -j DROP(临时封禁,重启失效);

  2. 长期防护:禁用 root 用户 SSH 登录(修改/etc/ssh/sshd_config,设置PermitRootLogin no),重启 SSH 服务systemctl restart sshd

  3. 进阶:安装 fail2ban 工具,自动封禁多次登录失败的 IP。

2. 场景 2:服务启动失败(以 Nginx 为例)

日志文件/var/log/nginx/error.log/var/log/messages

关键字failedemergAddress 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 端口被其他进程占用。

解决步骤

  1. 查找占用 80 端口的进程:netstat -tulpn | grep 80lsof -i:80

  2. 停止占用进程(如 Apache):systemctl stop httpd,或修改 Nginx 端口(编辑/etc/nginx/nginx.conf,将listen 80改为listen 8080);

  3. 重新启动 Nginx:systemctl start nginx

3. 场景 3:磁盘空间满额告警

日志文件/var/log/messagesdmesg

关键字no space leftdisk fullEXT4-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 分区(通常是 / 分区)磁盘空间已满,导致无法写入新文件。

解决步骤

  1. 查看磁盘占用情况:df -h(确认满额分区);

  2. 查找大文件:du -sh /var/* | sort -rh(优先清理 /var/log 下的旧日志或大文件);

  3. 临时释放空间:删除无用日志rm -rf /var/log/*.gz,或通过日志轮转清理logrotate -f /etc/logrotate.conf

  4. 长期优化:扩大磁盘分区,或调整日志轮转规则(如缩短保留时间)。

4. 场景 4:用户权限滥用(sudo 操作审计)

日志文件/var/log/auth.log/var/log/secure

关键字sudoCOMMAND=

日志片段

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 目录下所有文件的操作,需确认是否为合法操作。

解决步骤

  1. 核实操作合法性:联系 testuser 确认是否为误操作;

  2. 限制 sudo 权限:编辑/etc/sudoers文件(建议用visudo命令),移除不必要的用户 sudo 权限;

  3. 开启详细审计:修改 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测试。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐