< 返回

    Linux 服务器如何查看日志与排查问题

    2026-02-05 20:52 作者:技术部 阅读量:9

    Linux 服务器的日志系统是运维和故障排查的核心基础设施。它记录了从内核启动、硬件初始化、服务运行、用户登录到应用异常的几乎所有事件。现代 Linux(几乎所有 2015 年后主流发行版)默认使用 systemd-journald 作为主要日志守护进程,同时保留传统 rsyslogsyslog-ng 将部分日志写入纯文本文件。

    排查问题的本质思维模型是:

    1. 先定位“哪个组件出了问题”(服务?内核?网络?应用?)
    2. 再确定该组件的日志来源(journald?特定文件?)
    3. 过滤出相关时间窗口 + 关键词
    4. 观察模式(重复错误、时间相关性、资源耗尽前兆)
    5. 交叉验证(dmesg、ss、top、free、df 等状态 + 日志)

    1. 日志两大体系对比(理解来源是关键)

     
     
    体系 存储格式 主要查看工具 持久化默认情况 优点 缺点 主流发行版默认
    systemd-journald 二进制(结构化) journalctl 内存(volatile)或 /var/log/journal(persistent) 结构化字段丰富、查询高效、跨服务关联 不直观、需 journalctl 查看 Ubuntu 16.04+、Fedora、RHEL 7+、Debian 9+、Arch
    传统 Syslog 纯文本 less/tail/grep/awk 持久化(/var/log/*.log) 简单、兼容性强、可直接 grep 无结构、旋转后难关联、重启丢失部分上下文 老系统、Alpine、部分容器镜像
     

    绝大多数现代服务器同时存在两者:journald 捕获所有,rsyslog 把部分转发到 /var/log 文件。

    2. journalctl —— 现代服务器排查首选工具

    journalctl 是查看 systemd-journald 日志的唯一标准接口。它支持按时间、服务、优先级、进程、引导次数等多维度过滤。

    核心过滤参数(高频组合):

    • 时间范围 --since "2026-02-10 18:00"--until "2026-02-11 06:00"-b(本次启动以来) -b -1(上一次启动) -b 0(当前引导,显式写法)
    • 服务单元 -u nginx 或 -u nginx.service-u php8.3-fpm、 -u docker
    • 优先级(emerg、alert、crit、err、warning、notice、info、debug) -p err(只显示 error 及以上) -p warning..emerg(范围)
    • 进程/用户 _PID=1234_UID=1000 或 --user(当前用户)
    • 实时跟踪 -f(类似 tail -f)
    • 输出格式 -o json-pretty(结构化输出,便于 jq 处理) -o short-precise(带微秒时间戳)

    高频组合示例(理论描述,非代码):

    • 查看 nginx 服务从昨天 20:00 开始的所有错误 journalctl -u nginx --since "yesterday 20:00" -p err
    • 实时监控 ssh 登录失败尝试 journalctl -u ssh -f -g "Failed password"
    • 查看本次启动以来内核相关消息 journalctl -b -p warning..crit _TRANSPORT=kernel
    • 比较前后两次重启的启动过程差异 journalctl -b -1 -u initramfs* ; journalctl -b -u initramfs*

    3. 传统文本日志位置与含义(/var/log 下)

    即使 journald 主导,rsyslog 仍会把关键信息写入纯文本,便于脚本和快速 grep。

    常见文件对应关系(2026 年主流发行版):

    • 通用系统消息 Ubuntu/Debian → /var/log/syslog RHEL/Rocky/Alma → /var/log/messages
    • 认证与安全事件(登录、sudo、ssh、pam) Ubuntu/Debian → /var/log/auth.log RHEL 系 → /var/log/secure
    • 内核环形缓冲(启动、驱动、硬件错误) dmesg(内存中实时)或 journalctl -k / --dmesg
    • Web 服务器(Nginx/Apache) /var/log/nginx/{access,error}.log /var/log/apache2/{access,error}.log
    • 数据库 /var/log/mysql/error.log 或 /var/log/mariadb/mariadb.log /var/log/postgresql/postgresql-*.log
    • 应用自定义日志 通常在 /var/log/应用名/ 或 /opt/应用名/logs/

    排查路径建议:

    • 服务启动失败 → journalctl -u 服务名 -xe(-x 解释错误码)
    • 登录问题 → journalctl -u ssh 或 grep auth.log "Failed"
    • 磁盘/IO 问题 → journalctl -u systemd-fsck* 或 dmesg | grep -i error
    • OOM killed → journalctl -k | grep -i "out of memory"
    • 高负载前兆 → journalctl --since "1 hour ago" | grep -i "high load"

    4. 结构化排查流程(推荐闭环)

    1. 现象确认:是什么症状?何时开始?影响范围?
    2. 粗筛时间窗口:journalctl -b -p err(本次启动错误)或 -f(实时)
    3. 锁定嫌疑组件:systemctl status 可疑服务 → journalctl -u 该服务 -n 200
    4. 关键词过滤:加 -g "error|fail|denied|timeout|oom|crash"
    5. 交叉验证
      • 资源:top/htop/free -h/df -h/iostat
      • 网络:ss -s/netstat/ss -ltnp
      • 内核:dmesg -T | tail -50
      • 审计:ausearch -m avc -ts recent(如果启用 SELinux/AppArmor)
    6. 深挖:journalctl _PID=xxx 或 journalctl --since "时间" --until "时间" -o json | jq
    7. 验证修复:重启服务后立即 journalctl -f -u 服务名 观察

    5. 进阶技巧与最佳实践

    • 启用持久化 journal(否则重启丢失日志) 创建 /var/log/journal 目录并设置 Storage=persistent
    • 限制 journal 大小(防止 /var 爆满) journald.conf 中 SystemMaxUse=2G / RuntimeMaxUse=512M
    • 实时多服务监控 multitail /var/log/nginx/.log 或 journalctl -f -u nginx -u php -u mysql
    • 结构化输出 + 脚本化 journalctl -o json -f | jq 'select(.PRIORITY <= "3") | {time: .__REALTIME_TIMESTAMP, msg: .MESSAGE}'
    • 中央化(生产推荐) 转发到 Loki / ELK / Graylog / OpenObserve / ClickHouse 等,避免单机日志丢失

    日志排查的核心不是记住所有路径,而是建立“症状 → 组件 → 日志源 → 过滤条件 → 模式识别”的思考链条。

     

    熟练后,90% 的常见问题(服务挂了、端口不通、权限错误、资源耗尽、配置语法错)都能在 5–15 分钟内通过 journalctl + 几条 grep 定位根因。

    联系我们
    返回顶部