Nginx端配置

因为NGINXaccess_log语法是支持发送至远端的syslog的,我们就是利用这一特性来实现。既然可以收集至Graylog,我们的目标是可以对访问日志的列进行检索。

修改nginx.conf文件,增加一个log_format,将日志格式转化成JSON

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# nginx.conf
...
http {
    ...
    log_format json  '{"timestamp": "$time_iso8601", '
                     '"remote_addr": "$remote_addr", '
                     '"body_bytes_sent": $body_bytes_sent, '
                     '"request_time": $request_time, '
                     '"response_status": $status, '
                     '"request": "$uri", '
                     '"request_method": "$request_method", '
                     '"host": "$host",'
                     '"upstream_response_time": $upstream_response_time,'
                     '"upstream_addr": "$upstream_addr",'
                     '"http_x_forwarded_for": "$http_x_forwarded_for",'
                     '"http_referrer": "$http_referer", '
                     '"message": "$scheme://$host$request_uri $status $request_time",'
                     '"http_user_agent": "$http_user_agent" }';

    access_log syslog:server=172.16.18.11:5555 json;
    ...
}

Graylog端设置

  1. 进入管理端,创建一个类型为Raw/Plaintext UDPInput,输入名字,同时勾选Global,其他保持默认。 inputInput起来之后,访问Nginx,就会将访问日志发送过来了。但是,发送过来的日志内容是非序列化的,是原始字符串,而且NGINX还会加上它的标识,原始消息如下: 原始消息内容

  2. 虽然日志发送过来,但是是非序列化的,我们定义的json格式并不是真正的json内容。接下来就要针对原始内容做一点处理。Graylog引入了extractor功能,就是用来对输入的消息做些简单处理。在input列表页里面,再增加extractoradd 我们分析原始字符串,发现我们需要的JSON字符串是在nginx:后面的。而前面是NGINX添加的NGINX所在的主机名以及它自己的进程名称。所以第一步,我们使用extractorsplit&Index功能,将JSON字符串提取出来。

    分割字符串 根据nginx:分割 分割字符串 保存的字符段名仍为message,并且设置为cut,不需要保留原消息,以于节省磁盘空间。 分割字符串 再回到搜索页面,发现日志现在是JSON格式的,不过仍然是原始的JSON字符串。 原始JSON消息

  3. 重复刚才的步骤,再增加一个extractor,这次类型选择json 创建extractor 选择始终转换,类型也为cut,并命名 创建JSONextractor 二个都创建好的截图 已完成

  4. 完成,回到search页,你会发现NGINX的访问日志字段现在都可以作为检索列出现了。 可检索日志