2015-05-20 75 views
4

我正在尝试将请求的请求正文记录到我的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"}} 
+0

你不能把它的。在...中编码nginx的日志模块。但是,如果你把引号(如你以日志格式显示,但不是实际结果),它将是有效的js字符串,你可以在'JSON.parse'中使用。 –

+0

嗯,如果你使用非ascii,但是nginx的日志模块早在JSON变得流行或者甚至存在之前就已经写好了。 –

+0

对此行为有一些了解的相关问题可以在这里找到(http://serverfault.com/q/247271) – TomDotTom

回答

2

你可以用”不要停止逃跑,并且必须后处理它。

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"}' 

红宝石例如(从https://stackoverflow.com/a/18752208/2398354):

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

注:这最后一个例子是,如果后有用处理文件与logstash

0

像其他人一样,在nginx配置中没有办法解决这个问题。 但后处理它并不困难。如果请求主体JSON格式的,你可能会碰到很多\ X0A(行)和\ X22(“)中。

寻找到日志文件之前就清楚了那些与sed

这是给你的命令:LANG='' sed -E 's/(\\x0A|\\x22)//g' access.log

1

希望这将有助于有人 为了记录整个JSON请求转义 不要在HTTP块添加该配置

http { 
log_format postdata escape=json $request_body; 
access_log /var/log/nginx/access.log postdata; 
..... 
} 
+0

这添加了一个额外的字符串字面上我的日志'逃脱= json {\ x22d \ x22:\ x22d \ x22}' –

+0

我明白了。只有nginx <= 1.11.8支持这个 –