nginx 访问日志为带有查询字符串键值对的 json

nginx 访问日志为带有查询字符串键值对的 json

我想制作一个自定义的 nginx 访问日志,它不仅是 JSON,而且对于查询中的每个键=值都有 JSON 键:值对。

为 nginx 制作 JSON 日志很容易:

log_format main '{'
                 '"remote_addr": "$remote_addr",'
                 '"remote_user": "$remote_user",'
                 '"time_local":  "$time_local",'
                 '"request":     "$request",'
                 '"status":      "$status",'
                 '"body_bytes_sent": "$body_bytes_sent",'
                 '"http_referer": "$http_referer",' 
                 '"http_user_agent": "$http_user_agent"'
                 '}';

但是假设请求是GET /blah?foo=bar&hi=there%20mom

我在 json 中寻找另外 2 件事

... 'http_user_agent':'chrome', 'foo':'bar', 'hi':'there mom' }

可以这样做吗?如果可以,我该如何确保生成的 JSON 有效?(解码 URL 转义等)。

答案1

请查看HttpSetMiscModuleGitHub 仓库)。您必须自己编译 nginx 才能包含此模块。

之后你可以做如下事情:

GET /blah?foo=bar&hi=there%20mom

set $foo $arg_foo;
set $hi $arg_hi;
set_quote_json_str $foo;
set_quote_json_str $hi;
log_format main '{'
    '"remote_addr": "$remote_addr",'
    '"remote_user": "$remote_user",'
    '"time_local":  "$time_local",'
    '"request":     "$request",'
    '"status":      "$status",'
    '"body_bytes_sent": "$body_bytes_sent",'
    '"http_referer": "$http_referer",' 
    '"http_user_agent": "$http_user_agent"'
    '"arg_foo": "$foo"'
    '"arg_hi": "$hi"'
'}';

请注意我还没有测试过这个!

相关内容