在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系统特有的综合日志,内容覆盖
messages和auth.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. 日志轮转的核心原理
日志轮转的核心是“按规则分割日志”:当日志文件达到指定大小、或到达指定时间(天/周/月),系统会将当前日志重命名(比如messages→messages.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)。
- 解决:修正配置文件语法,调整日志文件权限,再手动触发轮转验证。