温馨提示×

nginx日志格式怎么改

小樊
41
2026-07-18 23:47:19
栏目: 编程语言

下面分几种常见场景,给你讲 如何修改 Nginx 日志格式,从“改配置”到“生效”一步一步来。


一、Nginx 日志格式在哪里改?

日志格式在 nginx.conf虚拟主机配置文件 中定义,通常位置:

/etc/nginx/nginx.conf
/etc/nginx/conf.d/*.conf
/etc/nginx/sites-enabled/*

二、定义日志格式(核心)

1️⃣ 使用 log_format

语法:

log_format 格式名 格式内容;

示例:自定义一个 JSON 日志格式

http {
    log_format main_json escape=json
        '{'
        '"time":"$time_iso8601",'
        '"host":"$host",'
        '"remote_addr":"$remote_addr",'
        '"request":"$request",'
        '"status":$status,'
        '"body_bytes_sent":$body_bytes_sent,'
        '"request_time":$request_time,'
        '"http_referer":"$http_referer",'
        '"http_user_agent":"$http_user_agent"'
        '}';

    access_log /var/log/nginx/access.log main_json;
}

escape=json:防止中文或特殊字符破坏 JSON(推荐


三、常见内置变量

变量 含义
$remote_addr 客户端 IP
$time_local 本地时间
$time_iso8601 ISO8601 时间
$request 请求行
$status HTTP 状态码
$body_bytes_sent 响应体大小
$http_referer Referer
$http_user_agent User-Agent
$request_time 请求总耗时
$upstream_response_time 后端响应时间

四、修改已有日志格式并生效

1️⃣ 修改配置

例如改成:

log_format main
    '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '$request_time';

2️⃣ 检查配置

nginx -t

3️⃣ 重载 Nginx(不中断服务)

nginx -s reload

五、不同 server / location 用不同日志格式

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/example_access.log main_json;

    location / {
        proxy_pass http://backend;
    }
}

六、错误日志格式能改吗?

不能自定义格式

只能改级别和路径:

error_log /var/log/nginx/error.log warn;

级别:

debug | info | notice | warn | error | crit | alert | emerg

七、常见坑

❌ 改了不生效

  • 忘了 nginx -s reload
  • 日志路径被 server 块覆盖

❌ JSON 被转义

log_format xxx escape=json '{ ... }';

❌ 变量为空

  • 某些变量只在 proxy_pass 后才有(如 $upstream_response_time

八、推荐生产级日志格式(JSON)

log_format json_log escape=json
    '{'
    '"time":"$time_iso8601",'
    '"host":"$host",'
    '"ip":"$remote_addr",'
    '"method":"$request_method",'
    '"uri":"$uri",'
    '"status":$status,'
    '"size":$body_bytes_sent,'
    '"req_time":$request_time,'
    '"ua":"$http_user_agent"'
    '}';

如果你愿意,可以告诉我:

  • ✅ 是 access 日志还是 error 日志
  • ✅ 是否 JSON 格式
  • ✅ 是否 Docker / K8s / 云环境

我可以直接给你一份 可直接用的配置

0