其他文章參考
FluentD 存取 Nginx Access Log (1/2)
FluentD 存取 Nginx Access Log (2/2)
以上是 Nginx + FluentD + (ES|Mongo) Demo
針對access.log 做解析
現在以Log4X 產生的日誌檔作為範例說明
會遇到的問題有
日誌內容會有多行的情況 # multiline
希望每條日誌內容加入 UUID 以便追蹤 # https://github.com/chaeyk/fluent-plugin-add-uuid
使用 Slack 作為通知的通道 # https://github.com/sowawa/fluent-plugin-slack
Log4X Layout Format Example
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<appender name="All" type="log4net.Appender.RollingFileAppender">
<file value="/var/log/web.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<datePattern value="yyyy-MM-dd" />
<maximumFileSize value="5MB" />
<maxSizeRollBackups value="10" />
<staticLogFileName value="true" />
<PreserveLogFileNameExtension value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date] [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<root>
<appender-ref ref="All" />
</root>
</log4net>
</configuration>
FluentD Dockerfile
#由於需要在FluentD中產生 UUID 及使用 Slack 作為通知通道
#加裝 fluent-plugin-slack && fluent-plugin-add-uuid
FROM fluent/fluentd:v1.8.1-1.0
# Use root account to use apk
USER root
# below RUN includes plugin as examples elasticsearch is not required
# you may customize including plugins as you wish
RUN apk add --no-cache --update --virtual .build-deps \
sudo build-base ruby-dev \
&& apk add mariadb-dev \
&& sudo gem install fluent-plugin-elasticsearch \
&& sudo gem install fluent-plugin-mongo \
&& sudo gem install fluent-plugin-sql \
&& sudo gem install mysql2 -v 0.5.2 \
&& sudo gem install fluent-plugin-add-uuid \
&& sudo gem install fluent-plugin-slack \
&& sudo gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /home/fluent/.gem/ruby/2.5.0/cache/*.gem
VOLUME ["/fluentd/etc","/fluentd/log","/var/log"]
FluentD configuration
<source>
@type tail
path /var/log/web.log
pos_file /var/log/td-agent/web.log4net.log.pos
tag log4net.web.sample
# ! 由於 multiline 的因素避免最後一列會等待新輸入而暫停解析
multiline_flush_interval 10s
<parse>
@type multiline
format_firstline /\[\d{4}-\d{1,2}-\d{1,2}/
format1 /^\[(?<logdt>[^\]]*)\] \[(?<thread>[^ ]*)\] (?<level>[^ ]*) (?<logger>[^ ]*) - (?<message>.*)/
</parse>
</source>
<filter log4net.web.sample>
# 只針對 Log Level = ERROR 寫入 Mongo & Push Slack
@type grep
<regexp>
key level
pattern /ERROR/
</regexp>
</filter>
<filter log4net.web.sample>
@type adduuid
key _uuid
</filter>
<match log4net.web.sample>
@type copy
<store>
@type mongo
# 略 ...
</store>
<store>
# https://github.com/sowawa/fluent-plugin-slack
@type slack
token xoxb- # bot user oAuth access token
username fluentd
webhook_url https://hooks.slack.com/services/ # webhook_url
title %s
title_keys tag
message %s %s
message_keys logdt,_uuid
</store>
</match>
留言
張貼留言