Linux 服务日志结构解析

1次阅读

Linux 服务日志结构解析

linux 服务日志没有统一固定结构,但主流系统(尤其是使用 systemd 的发行版)普遍采用标准化格式,核心由 时间戳、服务名、进程ID、日志级别、消息主体 构成,理解这个骨架能快速定位问题。

标准 journalctl 日志字段含义

运行 journalctl -u nginx.service -n 5 查看最近 5 条 Nginx 日志,典型行如下:

Jun 12 10:24:31 server01 nginx[1248]: 2024/06/12 10:24:31 [Error] 1248#1248: *1 open() “/var/www/html/nonexistent.html” failed (2: No such file or Directory), client: 192.168.1.5, server: _, request: “GET /nonexistent.html http/1.1”

  • Jun 12 10:24:31:系统本地时间(非 ISO 格式),由 journald 自动添加
  • server01:主机名,便于多机环境识别来源
  • nginx[1248]:服务名 + 方括号内主进程 PID,可关联 /proc/1248/ 查状态
  • : 2024/06/12…:服务自身输出的时间戳和内容,journald 不解析、仅透传

传统 syslog 日志(如 /var/log/syslog)的常见变体

未启用 systemd-journald 或兼容老服务时,日志常走 rsyslog 或 syslog-ng,格式更松散但仍有规律:

Jun 12 10:24:31 server01 sshd[987]: Failed password for invalid user admin from 192.168.1.10 port 54322 ssh2

  • 前 3 字段(月 日 时:分:秒)固定为 syslog 时间格式,无年份(需结合文件名或上下文推断)
  • server01 后紧跟服务名与 PID,如 sshd[987]
  • 冒号后为原始消息,不含结构化字段,需靠关键词(如 Failed passwordConnection closed)人工判断类型

服务自定义日志(如 /var/log/nginx/access.log)的字段控制

Web 服务器、数据库等常绕过系统日志,直接写入独立文件,格式完全由服务配置决定:

  • Nginx 的 log_format 指令定义 access.log 字段顺序,例如:$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent
  • PostgreSQL 的 log_line_prefix 可插入 %t(时间)、%u(用户)、%d(数据库)等占位符
  • 关键点:这类日志不带系统级 PID 和主机名,需从路径(/var/log/nginx/)和文件名反推服务身份

快速识别日志类型的实操技巧

  • head -n 1 /var/log/messages 看首行是否有 [PID]: 分隔的固定字段组
  • 运行 ls -lt /var/log/ | head -5 观察活跃日志文件名,含 .log 且无 .journal 后缀的多为传统或服务自定义日志
  • 对 systemd 服务,优先用 journalctl -u servicename;对非 systemd 服务(如源码编译的程序),直接查其配置指定的日志路径
text=ZqhQzanResources