我想制作一个自定义的 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
请查看HttpSetMiscModule(GitHub 仓库)。您必须自己编译 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"'
'}';
请注意我还没有测试过这个!