日志文件定位:如何找到日志文件

做运维这些年,我遇到过最尴尬的事——服务器出问题了,连日志在哪儿都找不到。你想想看,排查问题第一步就是找日志,结果这一步就卡住了,多耽误事。

今天咱们就把这事儿聊透。日志文件到底藏在哪里?不同系统有什么规律?命名规则又是怎样的?我把自己踩过的坑和总结的经验,一次性说清楚。

Linux 系统:日志的「老巢」

Linux 的日志文件,绝大多数都集中在 /var/log/ 目录下。这是系统日志的默认存放位置。我个人习惯,登录任何一台 Linux 服务器,第一件事就是先看看这个目录。

核心路径一览:

  • /var/log/messages —— 系统通用日志,很多发行版都有
  • /var/log/syslog —— Ubuntu、Debian 系列的系统日志
  • /var/log/secure —— 安全认证日志,谁登录过、谁失败了,全在这儿
  • /var/log/auth.log —— Ubuntu 下的认证日志,相当于 secure
  • /var/log/kern.log —— 内核日志,硬件问题、驱动报错看这里
  • /var/log/dmesg —— 内核环缓冲区信息,启动时的硬件检测记录
  • /var/log/boot.log —— 系统启动日志
  • /var/log/cron —— 定时任务执行日志
  • /var/log/maillog —— 邮件服务日志

我在项目中遇到过一台服务器频繁重启,查了半天硬件没问题。最后打开 /var/log/kern.log,发现是内存 ECC 报错。嗯,这种问题,不看内核日志根本想不到。

应用日志:别在系统目录里瞎找

很多新手会犯一个错——以为所有日志都在 /var/log 下。其实应用日志的存放位置,完全取决于部署方式。

常见应用日志路径:

  • Nginx:/var/log/nginx/access.log 和 error.log
  • Apache:/var/log/httpd/ 或 /var/log/apache2/
  • MySQL:/var/log/mysql/ 或 /var/log/mysqld.log
  • Tomcat:${CATALINA_HOME}/logs/,比如 /usr/local/tomcat/logs/
  • Java 应用:通常在应用部署目录下的 logs/ 或 log/ 文件夹
  • Docker 容器:/var/lib/docker/containers/<容器ID>/<容器ID>-json.log

说白了,应用日志的路径,你得看启动脚本或者配置文件。我曾经接手一个项目,日志被写到了 /opt/app/logs 下,找了半小时才找到。后来我养成了一个习惯——先看应用的启动脚本,里面一般会写日志路径。

Windows 系统:事件查看器才是主角

Windows 的日志管理和 Linux 完全不同。它不鼓励你直接去翻文件,而是通过「事件查看器」来查看。

Windows 日志核心位置:

  • 系统日志:%SystemRoot%\System32\winevt\Logs\System.evtx
  • 应用程序日志:%SystemRoot%\System32\winevt\Logs\Application.evtx
  • 安全日志:%SystemRoot%\System32\winevt\Logs\Security.evtx
  • IIS 日志:%SystemDrive%\inetpub\logs\LogFiles\
  • Windows 更新日志:%SystemRoot%\WindowsUpdate.log

小技巧: 在 Windows 上,按 Win + R,输入 eventvwr.msc,直接打开事件查看器。比去翻文件快多了。

Windows 的日志文件是二进制格式,不能用记事本直接打开。我见过有人用记事本打开 .evtx 文件,结果全是乱码。嗯,这个坑我踩过。

日志滚动策略:别让日志撑爆磁盘

日志如果不做滚动,早晚会把磁盘写满。我遇到过最夸张的一次,一个 Nginx 的 access.log 涨到了 80GB,直接把服务器搞挂了。

常见的滚动策略:

策略类型 说明 典型配置
按大小滚动 日志文件达到指定大小后,自动切割 如 100MB、1GB
按时间滚动 每天/每周/每月生成一个新文件 如 daily、weekly
按数量保留 只保留最近 N 个日志文件 如保留 7 个、30 个
混合策略 同时按大小和时间滚动 如每天滚动,保留 30 天

Linux 下最常用的工具是 logrotate:

# 一个典型的 Nginx 日志滚动配置
/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 640 nginx adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

这个配置的意思是:每天滚动一次,保留 30 天的日志,旧日志压缩存储。注意那个 postrotate 脚本,它告诉 Nginx 重新打开日志文件。如果不做这一步,Nginx 会继续往旧文件里写,滚动就白做了。

注意: 很多应用在日志滚动后,需要发送信号才能重新打开日志文件。比如 Nginx 用 USR1,Apache 用 USR1,Java 应用通常需要重启。我曾经因为忘了发信号,排查了整整一个下午。

日志文件命名规则:看懂名字就懂了一半

日志文件的命名,其实是有规律的。看懂命名规则,你就能快速定位到想要的时间段。

常见的命名模式:

  • 追加日期:access.log-20250101 或 access.log.2025-01-01
  • 追加序号:messages.1、messages.2(数字越大,日志越旧)
  • 追加时间戳:catalina.2025-01-01.log
  • 压缩后缀:access.log.1.gz、syslog.2.gz

举个例子,你看到 /var/log/nginx/access.log.2.gz,就知道这是两天前的访问日志,而且被压缩了。想看的话,得先 gunzip 或者用 zcat 查看。

我个人习惯,在配置日志滚动时,统一用 YYYY-MM-DD 的日期格式。这样按字母排序就是按时间排序,查找起来特别方便。

知识体系:日志定位的核心逻辑

下面这张图,是我总结的日志定位思路。你照着这个流程走,基本不会迷路。

日志定位核心流程 第一步:确定系统类型 Linux / Windows / 容器 第二步:判断日志类型 系统日志 / 应用日志 第三步:定位路径 /var/log/ 或 应用目录 Linux 系统 /var/log/messages /var/log/secure Windows 系统 事件查看器 %SystemRoot%\System32\winevt\ 应用日志 Nginx / MySQL / Tomcat 查看配置文件 第四步:检查滚动策略与命名规则 logrotate 配置 / 日期格式 / 压缩情况

这张图的核心思路就是:先看系统,再分类型,然后找路径,最后检查滚动和命名。按这个顺序来,不会漏掉关键信息。

避坑指南:我踩过的那些坑

最后分享几个实战中容易忽略的点:

  • 日志权限问题:有时候你找到了日志文件,但 cat 不出来。为什么?权限不够。普通用户可能没有 /var/log/secure 的读取权限。用 sudo 或者切到 root 用户。
  • 日志被清空:我曾经遇到过,日志文件还在,但内容是空的。后来发现是 logrotate 配置错了,把日志 truncate 了。检查一下 create 和 copytruncate 的区别。
  • 软链接陷阱:有些应用会把日志通过软链接指向别处。你看到 /var/log/app.log,其实它指向了 /data/logs/app.log。用 ls -l 看一下,别被迷惑。
  • 容器日志的特殊性:Docker 容器的日志默认是 json 格式,而且不会自动滚动。如果不配置,一个容器跑久了,日志文件能涨到几十 GB。记得在启动容器时加上 --log-opt max-size=10m --log-opt max-file=3。

一句话总结: 找日志,先看系统类型,再判断是系统日志还是应用日志,然后去对应的路径下找。别忘了检查滚动策略和命名规则,这能帮你快速定位到正确的时间段。

好了,日志定位这块儿就聊到这儿。记住这些路径和规则,下次服务器出问题,你至少知道去哪儿找线索。