流利的不是将解析的日志发送给Mongo

时间:2018-01-25 12:54:01

标签: mongodb parsing fluentd fluent-mongo td-agent

我正在使用Fluentd来解析日志并将解析后的日志存储在MongoDB中。

我的应用程序正在生成以下日志:

[2018-01-25 17:50:22] 192.168.10.1 GET http://localhost.com/mypage html 0 Mozilla/5.0 200 132

Fluentd正确解析日志,但不是时间(我猜)。因为MongoDB无法存储已解析的内容。它甚至没有反映在解析的日志中。 下面是解析的结果:

2018-01-25 17:50:22.000000000 +0000 request.main: {"ip-address":"192.168.10.1","request-method":"GET","request-url":"http://localhost.com/mypage","format":"html","request-size":"0","user-agent":"Mozilla/5.0","response-code":"200","response-duration":"132"}

但是,我没有看到这里解析的时间。并怀疑这种行为,fluent-plugin-Mongo读到:

  

[警告]:#0从v0.8起,将删除无效的记录检测,因为Mongo驱动程序v2.x和API规范不提供它。您可能会丢失无效记录,因此您不应将此类记录发送到Mongo插件

但是,使用fluentular时,它会正确解析。这是我的尾巴配置:

<source>
  @type tail
  path /home/app-logs/dev/my-app/%Y/%b/dev-main.log
  tag request.main
  time_format %Y-%m-%d %H:%M:%S 
  format /^\[(?<time>[^\]]*)\] (?<ip-address>[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*) (?<request-method>\w*) (?<request-url>[^ ]*) (?<format>[^ ]*) (?<request-size>\d*) (?<user-agent>[^ ]*) (?<response-code>\d*) (?<response-duration>\d*)$/
  pos_file /tmp/fluentd--1516882649.pos
</source>

mongo插件配置如下:

<match request.*>
  @type mongo
  host 127.0.0.1
  port 27017
  user foo
  password bar
  database my-app
  collection requests
  capped
  capped_size 100m
</match>

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

我正在使用Fluentd将Nginx日志传递给MongoDB,但我使用Nginx的配置文件创建了自定义日志格式。我让Nginx以json格式编写日志,这对我来说更容易处理。我认为使用Fluentd时这是一种更好的方法。 如果您可以将日志格式更改为json,也许可以尝试以下设置:

<source>
  @type tail
  path /path/json/server_nginx.access.log.json #...or where you placed your Apache access log
  pos_file /path2/server_nginx.access.log.json.pos # This is where you record file position
  tag nginx.access #fluentd tag!
  format json
</source>

<match **>
  @type mongo
  database logs #(required)
  collection foo #(optional; default="untagged")
  host ***.***.***.*** #(optional; default="localhost")
  port 27017 #(optional; default=27017)
  user notmyrealusername
  password notmyrealpassword
</match>

我不确定您的应用是否与nginx相关,但这些是我的nginx日志格式设置:

log_format logstash_json '{ "@timestamp": "$time_iso8601", '
                         '"@fields": { '
                         '"remote_addr": "$remote_addr", '
                         '"request_time": "$request_time", '
                         '"request": "$request", '
                         '"http_referrer": "$http_referer", '
                         '"http_host": "$host", '
                         '"http_user_agent": "$http_user_agent" } }';