nginx 将 $request_body 记录为十六进制
nginx logging $request_body as hexadecimal
我正在尝试将请求的请求正文记录到我的 api 并且 nginx 正在将所有引号(以及一些其他字符,如空格和制表符)转换为十六进制字符。
这是我的日志格式
log_format postdata '{"ts": "$time_iso8601", "status": $status, "req": "$uri", "meth": "$request_method", "body": "$request_body"}';
这是记录的内容
{"ts": "2015-05-20T15:31:11-07:00", "status": 400, "req": "/v2/track", "meth": "POST", "body": {\x22id\x22:\x22user id\x22}}
我怎样才能防止这种情况发生,以便生成的日志行是
{"ts": "2015-05-20T15:31:11-07:00", "status": 400, "req": "/v2/track", "meth": "POST", "body": {"id":"user id"}}
你不能停止转义它,将不得不post处理它。
Python2 示例:
line = '{\x22id\x22:\x22user id\x22}'
line.decode('unicode_escape')
>> u'{"id":"user id"}'
Python3 示例:
line = '{\x22id\x22:\x22user id\x22}'
bytes(line, 'utf-8').decode('unicode_escape')
>> '{"id":"user id"}'
Ruby 示例(来自 ):
require 'yaml'
line = '{\x22id\x22:\x22user id\x22}'
YAML.load(%Q(---\n"#{line}"\n))
=> "{\"id\":\"user id\"}"
注意:如果 post 使用 logstash
处理文件,最后一个示例很有用
正如其他人所说,无法在 nginx 配置中解决此问题。
但是post-处理它并不难。如果请求正文是 JSON 格式的,您可能会 运行 进入很多 \x0A(换行符)和 \x22(")。
在查看日志文件之前用 sed
清除那些。
这是给你的命令:LANG='' sed -E 's/(\x0A|\x22)//g' access.log
希望这对某人有所帮助。
为了记录整个 json 未转义的请求。
请在 http 中添加阻止此配置
http {
log_format postdata escape=json $request_body;
access_log /var/log/nginx/access.log postdata;
.....
}
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';
我正在尝试将请求的请求正文记录到我的 api 并且 nginx 正在将所有引号(以及一些其他字符,如空格和制表符)转换为十六进制字符。
这是我的日志格式
log_format postdata '{"ts": "$time_iso8601", "status": $status, "req": "$uri", "meth": "$request_method", "body": "$request_body"}';
这是记录的内容
{"ts": "2015-05-20T15:31:11-07:00", "status": 400, "req": "/v2/track", "meth": "POST", "body": {\x22id\x22:\x22user id\x22}}
我怎样才能防止这种情况发生,以便生成的日志行是
{"ts": "2015-05-20T15:31:11-07:00", "status": 400, "req": "/v2/track", "meth": "POST", "body": {"id":"user id"}}
你不能停止转义它,将不得不post处理它。
Python2 示例:
line = '{\x22id\x22:\x22user id\x22}'
line.decode('unicode_escape')
>> u'{"id":"user id"}'
Python3 示例:
line = '{\x22id\x22:\x22user id\x22}'
bytes(line, 'utf-8').decode('unicode_escape')
>> '{"id":"user id"}'
Ruby 示例(来自 ):
require 'yaml'
line = '{\x22id\x22:\x22user id\x22}'
YAML.load(%Q(---\n"#{line}"\n))
=> "{\"id\":\"user id\"}"
注意:如果 post 使用 logstash
处理文件,最后一个示例很有用正如其他人所说,无法在 nginx 配置中解决此问题。 但是post-处理它并不难。如果请求正文是 JSON 格式的,您可能会 运行 进入很多 \x0A(换行符)和 \x22(")。
在查看日志文件之前用 sed
清除那些。
这是给你的命令:LANG='' sed -E 's/(\x0A|\x22)//g' access.log
希望这对某人有所帮助。 为了记录整个 json 未转义的请求。 请在 http 中添加阻止此配置
http {
log_format postdata escape=json $request_body;
access_log /var/log/nginx/access.log postdata;
.....
}
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';