You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx-1.14.0生成JSON日志遇问题求解决方案及配置示例

解决Nginx JSON日志不生效的问题:模块调整、替代方案及配置示例

我来帮你捋清楚这个问题——之前我也碰到过类似的Nginx JSON日志死活出不来的情况,咱们先从你已经安装的两个模块入手排查,再给你几个不用额外模块的替代方案,最后附上完整配置示例。


一、现有两个模块的调整建议

1. nginx-http-json-log 模块(日志专用)

很多时候不生效都是配置细节踩坑了,你可以按下面的步骤检查:

  • 先确认模块真的编译进Nginx了:执行nginx -V,看输出的编译参数里有没有--add-module=/你的模块路径,如果没有,说明编译没成功,得重新编译Nginx,记得把模块路径写对。
  • 别搞混指令名:这个模块用的是json_log_format而不是原生的log_format!必须在http块里先定义JSON格式,再在server或location里引用。比如别写成log_format,那会用原生的文本格式,白搭。
  • 检查配置优先级:确保server块里的access_log指令没有覆盖你的JSON配置,比如不要同时存在access_log /var/log/nginx/access.log combined;(这是默认文本格式)和你的JSON日志配置,要把默认的注释掉或者删掉。

2. nginx-json-status-module(状态页专用)

注意哦!这个模块不是用来生成访问日志的,它的作用是让Nginx返回JSON格式的状态监控页面(比如访问/status就能看到Nginx的连接数、请求数等监控数据)。如果你想用它来输出访问日志,那方向完全错了,赶紧把它的配置和日志配置分开,别混在一起。


二、无需额外模块的JSON日志方案(推荐)

如果编译模块太折腾,用Nginx原生功能就能生成JSON日志,这是最稳妥的方案:

方案1:原生log_format拼接JSON

直接用原生的log_format把日志字段拼成合法的JSON字符串,不需要任何额外模块,编译标准Nginx就能用。这种方式的好处是稳定,不用维护第三方模块。

方案2:OpenResty Lua模块(灵活扩展)

如果需要更复杂的日志逻辑(比如添加自定义字段、过滤特定请求、动态修改日志内容),可以用OpenResty的lua-nginx-module,通过Lua脚本生成JSON日志,灵活性拉满。


三、完整nginx.conf配置示例

示例1:修复后的nginx-http-json-log模块配置

http {
    # 用模块专属指令定义JSON日志格式
    json_log_format my_json_log '{
        "timestamp": "$time_iso8601",
        "client_ip": "$remote_addr",
        "request_method": "$request_method",
        "request_uri": "$request_uri",
        "status": $status,
        "bytes_sent": $body_bytes_sent,
        "user_agent": "$http_user_agent"
    }';

    server {
        listen 80;
        server_name example.com;

        # 引用JSON日志格式,注释掉默认的文本日志
        access_log /var/log/nginx/access.json.log my_json_log;
        # access_log /var/log/nginx/access.log combined; # 注释掉这个

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }
}

示例2:原生log_format生成JSON配置

http {
    # 原生指令定义JSON格式,注意转义引号
    log_format my_json_log '{"timestamp":"$time_iso8601","client_ip":"$remote_addr","request_method":"$request_method","request_uri":"$request_uri","status":$status,"bytes_sent":$body_bytes_sent,"user_agent":"$http_user_agent"}';

    server {
        listen 80;
        server_name example.com;

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

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }
}

示例3:OpenResty Lua生成JSON配置

http {
    # 加载Lua模块(OpenResty默认已加载)
    lua_package_path "/usr/local/openresty/lualib/?.lua;;";

    server {
        listen 80;
        server_name example.com;

        # 用Lua脚本生成JSON日志
        access_log /var/log/nginx/access.json.log json;

        # 定义JSON日志格式的Lua逻辑
        log_by_lua_block {
            local log_data = {
                timestamp = ngx.localtime(),
                client_ip = ngx.var.remote_addr,
                request_method = ngx.var.request_method,
                request_uri = ngx.var.request_uri,
                status = ngx.var.status,
                bytes_sent = ngx.var.body_bytes_sent,
                user_agent = ngx.var.http_user_agent
            }
            -- 序列化为JSON字符串输出
            ngx.log(ngx.INFO, require("cjson").encode(log_data))
        }

        location / {
            root /usr/local/openresty/nginx/html;
            index index.html;
        }
    }
}

内容的提问来源于stack exchange,提问作者Jeeukrishnan Kayshyap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:04:46