nginx将$ request_body记录为十六进制

tbe*_*ais 8 hex json nginx

我正在尝试将请求的请求主体记录到我的api,nginx将所有引号(以及其他一些字符,如空格和制表符)转换为十六进制字符.

这是我的日志格式

log_format postdata '{"ts": "$time_iso8601", "status": $status, "req": "$uri", "meth": "$request_method", "body": "$request_body"}';
Run Code Online (Sandbox Code Playgroud)

这是记录的内容

{"ts": "2015-05-20T15:31:11-07:00", "status": 400, "req": "/v2/track", "meth": "POST", "body": {\x22id\x22:\x22user id\x22}}
Run Code Online (Sandbox Code Playgroud)

如何防止这样生成日志行

{"ts": "2015-05-20T15:31:11-07:00", "status": 400, "req": "/v2/track", "meth": "POST", "body": {"id":"user id"}}
Run Code Online (Sandbox Code Playgroud)

Gri*_*nov 13

Sinse 1.13 有一个“escape=none”参数可以关闭数据转义。

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

log_format  api_request_log escape=none '[$time_local] $request \n$request_body';
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 5

您不能停止转义它,而必须对其进行后期处理。

Python2示例:

line = '{\x22id\x22:\x22user id\x22}'
line.decode('unicode_escape')
>> u'{"id":"user id"}'
Run Code Online (Sandbox Code Playgroud)

Python3示例:

line = '{\x22id\x22:\x22user id\x22}'
bytes(line, 'utf-8').decode('unicode_escape')
>> '{"id":"user id"}'
Run Code Online (Sandbox Code Playgroud)

Ruby示例(来自/sf/answers/1312654591/):

require 'yaml'
line = '{\x22id\x22:\x22user id\x22}'
YAML.load(%Q(---\n"#{line}"\n))
=> "{\"id\":\"user id\"}"
Run Code Online (Sandbox Code Playgroud)

注意:如果使用logstash后处理文件,则最后一个示例很有用


Nef*_*nic 5

希望这对某人有帮助。为了记录整个json请求未转义。不要添加http阻止此配置

http {
 log_format postdata escape=json $request_body;
 access_log /var/log/nginx/access.log postdata;
 .....
}
Run Code Online (Sandbox Code Playgroud)