V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
Livid
V2EX  ›  NGINX

NGINX 里使用 JSON 格式记录结构化的日志

  •  1
     
  •   Livid · 2017-08-19 13:08:35 +08:00 · 12013 次点击
    这是一个创建于 2682 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2017-08-25 07:47:10 +08:00

    NGINX 1.11.8 及之后的版本在 log_format 配置指令中增加了一个 escape=json 选项,以保证来自 $variable 的值可以在 JSON 输出中被正确地转义:

    http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format

    8 条回复    2017-12-19 14:10:08 +08:00
    xi_lin
        1
    xi_lin  
       2017-08-19 13:46:59 +08:00
    直接这样配有坑的,要做好转码,不然生成的 json 容易崩
    另外,nginx 也有直接的 json log plugin,但是印象中也有坑,编译前看看源码,好像有些 case 没处理好
    rrfeng
        2
    rrfeng  
       2017-08-19 14:26:20 +08:00
    一直是这样搞的。

    如同 #1 所说,如果有 json 的话 nginx 是会直接打印 `\x22` 之类的东西。后面再处理的时候就比较费劲了。

    不过 nginx 日志一般不会记录 postdata,所以其实也无所谓。
    Citrus
        3
    Citrus  
       2017-08-25 09:25:53 +08:00 via iPhone
    手拼 Json 串是正确玩法么。。。
    est
        4
    est  
       2017-08-25 09:33:57 +08:00
    @Citrus 二次处理。
    ayiis
        5
    ayiis  
       2017-08-25 10:48:43 +08:00
    手拼 Json,然后在 logstash 里面处理好,到达应用时就是一个可解析的 json 结构了
    主要是在 logstash 的配置里面增加一个 filter
    缺点是数据变大,并且消耗性能

    ```code

    input {
    file {
    type => "nginx_access"
    path => "/opt/nginx-1.8.1/logs/logstash.access.log_*"
    sincedb_path => "/opt/logstash-2.3.2/sincedb-access"
    }
    }

    filter {
    if [type] != "nginx_access" or [message] == "" {
    drop { }
    } else {
    mutate {
    gsub => [
    # replace '\x' with '\u00', or json parser will fail
    "message", "([^\\](\\\\)*)\\x", "\1\\u00"
    ]
    }
    }
    }


    ```
    nanjishidu
        6
    nanjishidu  
       2017-08-25 10:59:30 +08:00
    @Citrus 测试的时候使用的手拼
    Livid
        7
    Livid  
    MOD
    OP
       2017-08-25 12:33:28 +08:00 via iPhone
    Logstash 可以把输入类型设置为 json_event
    stach
        8
    stach  
       2017-12-19 14:10:08 +08:00
    “ nginx access_log request_body 中文字符解析方法”
    http://hopehook.com/2017/12/18/nginx_request_body_parse/

    我写了篇文章,特地分享出来,解决了解码问题,Logstash 直接用,不用特意修改 nginx。

    1 直接解析 access_log 会报错,request_body 人为转义一次,然后把 access_log 外层的 json 解析出来,以便取出 request_body
    message = message.gsub('\\x', '\\\\\\x')

    2 r 把 equest_body 中文内容解码出来
    word = (request_body[pt + 2] + request_body[pt + 3]).to_i(16).chr
    new_request_body = new_request_body + word
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:17 · PVG 03:17 · LAX 11:17 · JFK 14:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.