You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何定位Linux系统中位置异常的日志文件及未轮转的日志文件?

兄弟,这种没人说得清的「祖传」服务器集群简直是运维噩梦,我之前也碰到过类似情况,给你整理一套一步步落地的方案,帮你搞定日志排查和后续配置的问题:

一、定位所有正在写入的日志文件(含/var/log外的异常位置)
  • lsof追踪实时写入的文件:这是抓活跃日志最直接的方式,能找出所有被进程打开且处于写入/追加状态的文件。
    基础命令:lsof -w | grep -E '(REG|DIR)' | grep -E '(WRITE|APPEND)'
    要排除/var/log目录的话,追加过滤:lsof -w | grep -E '(REG|DIR)' | grep -E '(WRITE|APPEND)' | grep -v '/var/log/'
    如果想盯特定进程的日志,直接按PID过滤:lsof -p <目标进程PID> | grep WRITE

  • 遍历文件系统找近期修改的大文件:日志文件通常会持续写入,用find扫整个系统,定位近期更新的大文件:
    示例命令:find / -type f -mmin -60 -size +10M ! -path "/proc/*" ! -path "/sys/*" ! -path "/dev/*"
    解释:找1小时内修改、大小超过10M的文件,排除系统伪文件系统(/proc、/sys这些),可以根据实际情况调整-mmin(时间范围)和-size(大小阈值)。

  • 扒应用配置文件找日志路径:自制应用一般会在配置里明确日志位置,搜常见配置文件里的关键词:
    命令:grep -r -i "log\|logger\|output" /opt /home /usr/local --include="*.conf" --include="*.ini" --include="*.yaml" --include="*.yml"
    重点扫自制应用常部署的目录:/opt、用户home目录、/usr/local,大概率能挖到藏在犄角旮旯的日志路径。

二、排查未轮转、增长迅速的日志文件
  • 检查logrotate配置:系统默认用logrotate管理日志轮转,先查目标日志有没有被纳入配置:
    命令:grep -r "<目标日志路径>" /etc/logrotate*
    要是没匹配到结果,说明这个日志完全没配置轮转,是重点排查对象。

  • 实时监控文件增长速度:用watch配合du快速看文件大小变化:
    命令:watch -n 60 'du -h /path/to/target.log'
    这个命令会每分钟刷新一次文件的大小。如果要更精确计算增长幅度,可以写个小脚本:

    #!/bin/bash
    TARGET_FILE="/path/to/target.log"
    OLD_SIZE=$(stat -c "%s" "$TARGET_FILE")
    sleep 300 # 等待5分钟
    NEW_SIZE=$(stat -c "%s" "$TARGET_FILE")
    GROWTH=$(( (NEW_SIZE - OLD_SIZE) / 1024 / 1024 ))
    echo "5分钟内日志增长了 ${GROWTH} MB"
    
  • 揪出系统里的超大日志:直接扫所有大文件,优先排查超过1G的(这类基本都是没轮转的日志):
    命令:find / -type f -size +1G ! -path "/proc/*" ! -path "/sys/*" ! -path "/dev/*"

三、重新配置应用日志与轮转的最佳实践
  • 尽量统一日志路径(可选):如果条件允许,把自制应用的日志迁移到/var/log/下的专属子目录(比如/var/log/myapp/),方便统一管理,修改应用配置后重启进程生效。

  • 给未轮转的日志加logrotate规则:在/etc/logrotate.d/下新建对应应用的配置文件,比如/etc/logrotate.d/myapp,示例配置:

    /opt/myapp/logs/app.log {
        daily          # 每天轮转一次
        rotate 7       # 保留最近7份日志
        compress       # 压缩旧日志
        delaycompress  # 延迟压缩最新的旧日志(避免进程读写问题)
        missingok      # 日志文件不存在时不报错
        notifempty     # 空日志不轮转
        create 640 root adm  # 新建日志文件的权限和属主
        postrotate
            # 轮转后重载应用(如果应用需要重新打开日志文件的话)
            systemctl reload myapp.service > /dev/null 2>&1 || true
        endscript
    }
    

    要是日志增长极快,可以加size 100M,达到100M就触发轮转,不用等每天的时间点。

  • 集中日志收集(可选):多台服务器的话,建议部署rsyslog或者轻量的日志收集工具,把所有日志集中存储,既能统一监控,也能避免单台服务器磁盘被日志撑爆。

内容的提问来源于stack exchange,提问作者Mnebuerquo

火山引擎 最新活动