温馨提示×

nginx日志格式如何修改

小樊
49
2026-09-05 17:41:17
栏目: 编程语言

在 Nginx 中,日志格式是通过 log_format 指令定义的,然后在 access_log 指令中引用。下面从基础到常见示例给你讲清楚。


一、修改日志格式的基本步骤

1️⃣ 定义日志格式(log_format

一般在 http 块中(通常是 nginx.confconf.d/*.conf):

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

    access_log /var/log/nginx/access.log main;
}
  • main 是日志格式的名字(可自定义)
  • 后面是日志内容模板(变量组成)

2️⃣ 应用到 access_log

server {
    access_log /var/log/nginx/access.log main;
}

也可以按 serverlocation 单独指定不同格式。


二、常用 Nginx 日志变量

变量 说明
$remote_addr 客户端 IP
$time_local 本地时间
$request 请求行(方法 + URL + 协议)
$status HTTP 状态码
$body_bytes_sent 响应体大小
$http_referer 来源页
$http_user_agent 客户端 UA
$request_time 请求总耗时(秒)
$upstream_response_time 后端响应时间
$host 请求的 Host
$request_method 请求方法(GET/POST)

三、常见日志格式示例

✅ JSON 格式(推荐,方便 ELK / Loki)

log_format json escape=json '{
  "time": "$time_local",
  "remote_addr": "$remote_addr",
  "request": "$request",
  "status": $status,
  "request_time": $request_time,
  "upstream_time": "$upstream_response_time",
  "user_agent": "$http_user_agent"
}';

使用:

access_log /var/log/nginx/access.log json;

✅ 包含真实 IP(代理场景)

log_format proxy '$remote_addr - $http_x_forwarded_for - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent';

✅ 性能分析格式

log_format perf '$remote_addr [$time_local] '
                '"$request" $status '
                'rt=$request_time urt=$upstream_response_time';

四、修改后必须做的操作

nginx -t      # 检查配置
nginx -s reload

五、注意事项

  1. log_format 只能定义在 http
  2. 修改格式后,已有日志不会变,只影响新日志
  3. 高并发场景建议:
    • 使用 buffer=gzip 日志
    access_log /var/log/nginx/access.log main buffer=32k gzip=1;
    

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

  • 你用的是 原生 Nginx / OpenResty / K8s Ingress
  • 想记录 什么字段
  • 日志用途(排查 / 审计 / 监控)

我可以直接帮你写一份可用的配置。

0