NGINX 里使用 JSON 格式记录结构化的日志

2017-08-19 13:08:35 +08:00
 Livid
https://blog.pkhamre.com/logging-to-logstash-json-format-in-nginx/
11812 次点击
所在节点    NGINX
8 条回复
xi_lin
2017-08-19 13:46:59 +08:00
直接这样配有坑的,要做好转码,不然生成的 json 容易崩
另外,nginx 也有直接的 json log plugin,但是印象中也有坑,编译前看看源码,好像有些 case 没处理好
rrfeng
2017-08-19 14:26:20 +08:00
一直是这样搞的。

如同 #1 所说,如果有 json 的话 nginx 是会直接打印 `\x22` 之类的东西。后面再处理的时候就比较费劲了。

不过 nginx 日志一般不会记录 postdata,所以其实也无所谓。
Citrus
2017-08-25 09:25:53 +08:00
手拼 Json 串是正确玩法么。。。
est
2017-08-25 09:33:57 +08:00
@Citrus 二次处理。
ayiis
2017-08-25 10:48:43 +08:00
手拼 Json,然后在 logstash 里面处理好,到达应用时就是一个可解析的 json 结构了
主要是在 logstash 的配置里面增加一个 filter
缺点是数据变大,并且消耗性能

```code

input {
file {
type => "nginx_access"
path => "/opt/nginx-1.8.1/logs/logstash.access.log_*"
sincedb_path => "/opt/logstash-2.3.2/sincedb-access"
}
}

filter {
if [type] != "nginx_access" or [message] == "" {
drop { }
} else {
mutate {
gsub => [
# replace '\x' with '\u00', or json parser will fail
"message", "([^\\](\\\\)*)\\x", "\1\\u00"
]
}
}
}


```
nanjishidu
2017-08-25 10:59:30 +08:00
@Citrus 测试的时候使用的手拼
Livid
2017-08-25 12:33:28 +08:00
Logstash 可以把输入类型设置为 json_event
stach
2017-12-19 14:10:08 +08:00
“ nginx access_log request_body 中文字符解析方法”
http://hopehook.com/2017/12/18/nginx_request_body_parse/

我写了篇文章,特地分享出来,解决了解码问题,Logstash 直接用,不用特意修改 nginx。

1 直接解析 access_log 会报错,request_body 人为转义一次,然后把 access_log 外层的 json 解析出来,以便取出 request_body
message = message.gsub('\\x', '\\\\\\x')

2 r 把 equest_body 中文内容解码出来
word = (request_body[pt + 2] + request_body[pt + 3]).to_i(16).chr
new_request_body = new_request_body + word

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/384164

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX