Linux系统日志分析完全教程:/var/log目录、日志轮转与关键日志解读

138 阅读7分钟

在Linux服务器运维中,系统日志是排查故障、审计安全、监控运行状态的核心依据。无论是新手运维还是资深工程师,掌握/var/log日志目录结构、日志轮转机制以及关键日志解读方法,都能大幅提升问题定位效率。

一、/var/log日志目录:Linux系统的“事件记录仪”

Linux系统的绝大多数日志文件默认集中存储在/var/log目录下,不同日志文件各司其职,记录着系统、服务、用户的各类操作。以下是日常运维中最常用的核心日志文件,附带具体用途和查看场景:

1. 核心日志文件详解

  • /var/log/messages:系统主日志文件,记录内核消息、系统服务启动/停止、全局事件等。比如服务器突然重启、硬件驱动异常、系统资源告警等,优先查看这个文件。
  • /var/log/auth.log(Ubuntu/Debian)/var/log/secure(CentOS/RHEL):用户认证日志,核心用于安全审计。包含SSH登录(成功/失败)、sudo权限使用、密码验证、用户创建/删除等操作,排查暴力破解、权限滥用时必看。
  • /var/log/syslog:Ubuntu/Debian系统特有的综合日志,内容覆盖messagesauth.log的部分功能,记录更详细的系统和应用事件。
  • /var/log/kern.log:内核日志,专门记录内核相关信息,比如内核模块加载、硬件故障(磁盘、网卡、内存)、内核报错等,排查硬件兼容性问题时重点关注。
  • /var/log/boot.log:系统启动日志,记录开机过程中服务启动顺序、启动结果(成功/失败)。如果服务器开机后某服务无法启动,可通过该日志查看启动失败原因。
  • /var/log/dpkg.log(Ubuntu/Debian):软件包管理日志,记录通过dpkg/apt安装、升级、卸载软件的全过程,比如安装Nginx时依赖缺失,可在这里查找报错信息。
  • /var/log/yum.log(CentOS/RHEL):YUM包管理日志,功能同dpkg.log,记录yum命令操作软件包的详细日志。
  • /var/log/maillog:邮件服务日志,记录Postfix、Sendmail等邮件服务的发送/接收记录、队列状态、报错信息,排查邮件发送失败问题时使用。
  • /var/log/httpd/(Apache)/var/log/nginx/(Nginx):Web服务日志目录,包含访问日志(access.log)和错误日志(error.log)。访问日志记录用户请求(IP、时间、URL、状态码),错误日志记录服务异常(端口占用、配置错误、脚本报错)。

2. 日志文件查看基础命令

日常查看日志无需复杂工具,几个基础命令就能满足需求:

  • 实时查看日志:tail -f /var/log/messages(动态刷新最新日志,排查实时故障)
  • 搜索关键字:grep "error" /var/log/syslog(查找包含“error”的日志行,可替换为“Failed”“warning”等)
  • 按时间筛选:grep "2024-05-20" /var/log/auth.log(查找指定日期的日志,需结合日志时间格式调整)
  • 查看日志前N行:head -n 50 /var/log/boot.log(快速了解启动初期的日志信息)

二、日志轮转:避免日志文件“撑爆”磁盘

如果日志文件一直记录不清理,会逐渐占用大量磁盘空间,甚至导致系统磁盘满额故障。日志轮转(logrotate)是Linux系统自带的日志管理机制,通过自动分割、压缩、删除旧日志,保证日志文件大小可控。

1. 日志轮转的核心原理

日志轮转的核心是“按规则分割日志”:当日志文件达到指定大小、或到达指定时间(天/周/月),系统会将当前日志重命名(比如messagesmessages.1),并创建新的空日志文件继续记录;旧日志会按规则压缩(后缀为.gz)、保留指定份数,超出份数的旧日志自动删除。

2. 日志轮转的配置文件与参数

日志轮转的配置主要集中在两个位置,可根据需求自定义规则:

  • 全局配置文件:/etc/logrotate.conf(系统级默认规则,比如默认保留4份旧日志、每周轮转一次)
  • 应用专属配置:/etc/logrotate.d/(目录下存放各类应用的日志轮转规则,比如nginx、ssh、syslog等,优先级高于全局配置)

常用配置参数解读(以Nginx日志轮转为例)

打开/etc/logrotate.d/nginx,典型配置如下:

/var/log/nginx/*.log {
    daily                # 每日轮转一次
    missingok            # 日志文件不存在时不报错
    rotate 7             # 保留7份旧日志(超过7份自动删除)
    compress             # 旧日志压缩(.gz格式)
    delaycompress        # 延迟压缩,只压缩前一天的日志(避免正在使用的日志被压缩)
    notifempty           # 日志文件为空时不轮转
    create 0640 www-data www-data  # 新建日志文件的权限、属主、属组
    sharedscripts        # 所有日志文件轮转后只执行一次脚本
    postrotate           # 轮转后执行的脚本(重启Nginx让新日志生效)
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

3. 手动触发日志轮转(实操技巧)

如果需要立即执行日志轮转,无需等待自动触发,可执行以下命令:

  • 执行指定应用的轮转:logrotate /etc/logrotate.d/nginx
  • 执行全局轮转(加-v可查看详细过程):logrotate -v /etc/logrotate.conf
  • 强制轮转(忽略配置中的时间/大小规则):logrotate -f /etc/logrotate.d/nginx

三、关键日志解读:从日志中定位问题

日志解读的核心是“找关键字、对应场景”,以下是运维中最常见的场景,结合具体日志片段讲解如何分析:

1. 场景1:SSH登录失败(暴力破解排查)

查看/var/log/auth.log(Ubuntu)或/var/log/secure(CentOS),搜索关键字“Failed”:

May 20 08:30:12 localhost sshd[12345]: Failed password for root from 192.168.1.100 port 54321 ssh2
May 20 08:30:15 localhost sshd[12345]: PAM: Authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.100
  • 解读:192.168.1.100这个IP尝试用root用户登录,密码错误,可能是暴力破解。
  • 处理:立即封禁该IP(通过iptables或防火墙),建议禁用root用户SSH登录,改用普通用户+sudo权限。

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

查看/var/log/messages/var/log/nginx/error.log

May 20 09:15:00 localhost nginx[6789]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
  • 解读:Nginx启动失败,原因是80端口被占用。
  • 处理:执行netstat -tulpn | grep 80查找占用80端口的进程,停止该进程或修改Nginx端口。

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

查看/var/log/messages,搜索关键字“disk full”或“no space”:

May 20 10:20:00 localhost kernel: EXT4-fs warning (device sda1): ext4_dx_add_entry:2366: inode #12345: comm rsync: Directory index full!
  • 解读:/dev/sda1分区(通常是/分区)磁盘空间已满,导致目录索引无法写入。
  • 处理:执行df -h查看磁盘占用,删除无用文件(比如旧日志、大文件)释放空间。

4. 场景4:用户sudo权限滥用

查看/var/log/auth.log,搜索关键字“sudo”:

May 20 11:30:00 localhost sudo:  testuser : TTY=pts/0 ; PWD=/home/testuser ; USER=root ; COMMAND=/bin/rm -rf /tmp/*
  • 解读:testuser用户通过sudo执行了删除/tmp目录下所有文件的操作,需确认是否为合法操作。
  • 处理:如果是非法操作,检查用户权限配置,必要时收回sudo权限,开启sudo操作审计。

四、日志分析常见问题与解决技巧

1. 日志文件为空?

  • 原因1:服务未启动,没有产生日志(比如Nginx没启动,access.log为空)。
  • 原因2:日志轮转刚执行,旧日志已被分割,新日志还未产生。
  • 解决:启动对应服务,或等待服务产生事件,也可手动触发服务操作(比如访问Nginx网站)生成日志。

2. 日志太多,找不到关键信息?

  • 技巧1:结合时间范围筛选,比如grep "May 20 14:" /var/log/messages(查找5月20日14点的日志)。
  • 技巧2:多关键字组合搜索,比如grep "ssh" /var/log/auth.log | grep "Failed"(只看SSH登录失败的日志)。
  • 技巧3:使用less命令分页查看,less /var/log/secure,按/输入关键字搜索。

3. 日志轮转不生效?

  • 原因1:配置文件语法错误,执行logrotate -d /etc/logrotate.d/nginx(调试模式)查看报错。
  • 原因2:日志文件权限不足,logrotate无法修改,需确保日志文件属主属组正确(比如nginx日志属主为www-data)。
  • 解决:修正配置文件语法,调整日志文件权限,再手动触发轮转验证。