【问题标题】:nginx logging $request_body as hexadecimalnginx 将 $request_body 记录为十六进制
【发布时间】:2015-05-20 22:32:13
【问题描述】:

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

【问题讨论】:

  • 你不能。它在 nginx 的日志模块中进行了编码。但是,如果您在周围加上引号(就像您以日志格式显示,但不是以实际结果显示),它将是有效的 js 字符串,您可以在 JSON.parse 中使用它
  • 好吧,如果你使用非 ascii,实际上是无效的,但是 nginx 的日志模块是在 JSON 流行甚至存在之前很久就编写的
  • 可以找到对这种行为有一点了解的相关问题here
  • 嗨@tbeauvais,现在这个问题有了真正的解决方案——请接受。请参阅 Grigori Kochanov 的答案。

标签: json nginx hex


【解决方案1】:

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';

【讨论】:

  • 现在是 2020 年,这绝对是正确答案。
【解决方案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"}'

Ruby 示例(来自https://stackoverflow.com/a/18752208/2398354):

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这在我的日志中添加了一个额外的字符串文字escape=json{\x22d\x22:\x22d\x22}
    • 我明白了。只有 nginx
    【解决方案4】:

    就像其他人说的,没有办法在 nginx 配置中解决这个问题。 但是后处理它并不难。如果请求正文是 JSON 格式,您可能会遇到很多 \x0A(换行符)和 \x22(")。

    在查看日志文件之前,只需使用 sed 清除那些。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多