Contents

Linux系统中/var/log/messages文件过大问题分析与解决

Linux系统中/var/log/messages文件过大问题分析与解决

问题描述

线上服务器磁盘占用非常高,排查发现 /var/log/messages 文件非常大。

问题原因分析

/var/log/messages 文件介绍

/var/log/messages 是 Linux 系统中最重要的日志文件之一,它记录了系统级别的信息,包括:

  • 系统启动信息
  • 内核消息
  • 系统服务(如 cron、sshd、sudo 等)的日志
  • 非认证相关的安全信息
  • 各种应用程序的通用日志消息

文件过大的常见原因

  1. 日志记录级别过低:系统可能配置为记录过多详细信息
  2. 系统错误频繁发生:某个服务或进程不断报错
  3. 日志轮转(logrotate)配置不当:没有及时归档和清理旧日志
  4. 特定应用程序产生大量日志:某些应用可能未正确配置日志级别
  5. 系统受到攻击:可能有恶意活动导致大量日志生成

解决方法

临时清理方法

  1. 查看日志大小和内容
ls -lh /var/log/messages
head -n 50 /var/log/messages
  1. 压缩并备份当前日志
gzip -c /var/log/messages > /var/log/messages.$(date +%Y%m%d).gz
> /var/log/messages  # 清空当前日志文件

永久解决方案

1. 配置 logrotate 进行更频繁的日志轮转

编辑 /etc/logrotate.d/syslog 文件:

vi /etc/logrotate.d/syslog

修改配置示例:

/var/log/messages
/var/log/secure
/var/log/maillog
/var/log/spooler
/var/log/boot.log
/var/log/cron
{
    daily                # 每天轮转一次
    rotate 7             # 保留7个旧日志
    missingok
    notifempty
    compress             # 压缩旧日志
    delaycompress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

2. 减少日志记录级别

对于 CentOS/RHEL 系统: 编辑 /etc/rsyslog.conf 文件:

vi /etc/rsyslog.conf

修改全局日志级别,将 *.info 改为更高级别如 *.notice*.warn

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

改为:

*.notice;mail.none;authpriv.none;cron.none              /var/log/messages

修改后重启 rsyslog 服务:

systemctl restart rsyslog

3. 完全关闭 /var/log/messages(不推荐)

不建议完全关闭系统日志,这会导致系统问题难以诊断。但如果确实需要:

/etc/rsyslog.conf 中注释掉或删除相关行:

# *.info;mail.none;authpriv.none;cron.none                /var/log/messages

然后重启 rsyslog 服务:

systemctl restart rsyslog

4. 屏蔽特定程序写入 /var/log/messages

如果只需要阻止特定程序写入 /var/log/messages,可以通过在 rsyslog 配置中添加过滤规则来实现:

  1. 查找特定程序的标识符 首先需要确定程序在日志中的标识符(通常是进程名)。可以通过查看日志内容来识别:
grep -i "程序名" /var/log/messages | head -n 10
  1. 在 rsyslog 中添加过滤规则 创建或编辑 rsyslog 配置文件:
vi /etc/rsyslog.d/block-program.conf

添加以下规则来阻止特定程序的日志写入 /var/log/messages

# 阻止特定程序写入 /var/log/messages
:programname, isequal, "程序名" ~

其中:

  • :programname 是日志字段选择器,匹配程序名称
  • isequal 是比较操作符
  • "程序名" 替换为要阻止的实际程序名
  • ~ 表示丢弃匹配的消息(不记录)
  1. 如果程序使用不同的标识方式,也可以基于其他字段进行过滤:
# 基于日志来源过滤
:syslogtag, isequal, "程序名[" ~

# 或基于包含特定字符串的消息过滤
:msg, contains, "特定字符串" ~
  1. 应用配置 修改后重启 rsyslog 服务:
systemctl restart rsyslog

注意:这种方法只是阻止程序日志写入 /var/log/messages,程序仍会尝试生成日志。如果需要完全禁用程序的日志功能,最好修改该程序自身的日志配置。

安全考虑

关闭或减少系统日志会降低系统的可审计性和问题诊断能力。建议采取以下平衡措施:

  1. 适当调整日志级别,但保留足够的信息用于故障排查
  2. 确保 logrotate 正常工作,定期归档和清理旧日志
  3. 考虑设置日志大小限制,防止单个日志文件过大
  4. 监控日志生成速率,及时发现异常

最佳实践

  1. 定期检查日志文件大小:建立监控机制
  2. 分析日志内容:找出产生大量日志的原因,从根本上解决
  3. 合理配置 logrotate:根据服务器负载调整轮转频率
  4. 考虑集中式日志管理:对于多服务器环境,使用 ELK Stack 或 Graylog 等工具

总结

/var/log/messages 文件过大通常是由于日志配置不当或系统异常导致的。建议优先采用日志轮转和级别调整的方式解决,而非完全关闭日志记录。在处理过程中,需要平衡系统可维护性和磁盘空间占用。