JBoss EAP 7でJSON Lines形式のログをFluentdに渡す

こんにちは。平田です。

JBoss EAP 7のサーバログをFluentdに渡す際、正規表現でがんばって分解することになります。代わりにログ出力側でFluentd(やその他のログコレクタ)向けに構造化しとけば良いんじゃないか、と思いました。

こちらの記事を参考に、JSON Lines形式でログ出力してみました。

参考にした記事はLogStashに渡す手順ですが、記事の中で使っているjboss-logmanager-extの中に、JSONのフォーマッタが含まれており、これを流用します。

まずjboss-logmanager-extをダウンロードします。

$ mvn dependency:get -DgroupId=org.jboss.logmanager -DartifactId=jboss-logmanager-ext -Dversion=1.0.0.Alpha3 -Dtransitive=false

次にJSONフォーマッタを適用します。EAPを起動し、CLIでコマンドを実行します。

まずモジュールを追加し、JSONフォーマッタ、JSON形式で出力するハンドラをROOTロガーに追加します。

module add --name=org.jboss.logmanager.ext --dependencies=org.jboss.logmanager,javax.json.api,javax.xml.stream.api --resources=~/.m2/repository/org/jboss/logmanager/jboss-logmanager-ext/1.0.0.Alpha3/jboss-logmanager-ext-1.0.0.Alpha3.jar
/subsystem=logging/custom-formatter=json:add(class=org.jboss.logmanager.ext.formatters.JsonFormatter,module=org.jboss.logmanager.ext)
/subsystem=logging/size-rotating-file-handler=JSON:add(named-formatter=json, max-backup-index=10, file={relative-to="jboss.server.log.dir", path="server.json.log"}, append=true) 
/subsystem=logging/root-logger=ROOT:add-handler(name=JSON)

サーバログが JSON形式で出力されます($JBOSS_HOME/standalone/log/server.json.log)。

{"timestamp":"2016-08-25T15:00:00.002+0900","sequence":459,"loggerClassName":"org.jboss.logmanager.Logger","loggerName":"stdout","level":"INFO","threadName":"EJB default - 6","message":"ScheduleExample.doWork() invoked at 2016.08.25 西暦 at 15:00:00 JST","threadId":125,"mdc":{},"ndc":""}
{"timestamp":"2016-08-25T15:00:00.003+0900","sequence":460,"loggerClassName":"org.jboss.logmanager.Logger","loggerName":"stdout","level":"INFO","threadName":"EJB default - 8","message":"TimeoutExample.scheduler() EJB timer service timeout at 2016.08.25 西暦 at 15:00:00 JST","threadId":127,"mdc":{},"ndc":""}
{"timestamp":"2016-08-25T15:00:03.002+0900","sequence":461,"loggerClassName":"org.jboss.logmanager.Logger","loggerName":"stdout","level":"INFO","threadName":"EJB default - 3","message":"TimeoutExample.scheduler() EJB timer service timeout at 2016.08.25 西暦 at 15:00:03 JST","threadId":121,"mdc":{},"ndc":""}
{"timestamp":"2016-08-25T15:00:06.004+0900","sequence":462,"loggerClassName":"org.jboss.logmanager.Logger","loggerName":"stdout","level":"INFO","threadName":"EJB default - 7","message":"ScheduleExample.doWork() invoked at 2016.08.25 西暦 at 15:00:06 JST","threadId":126,"mdc":{},"ndc":""}

続いてFluentdを設定します。tailプラグインでサーバログを読み、Fluentdの標準出力に出します。

<source>
 @type        tail
 path         /path/to/jboss-eap-7.0/standalone/log/server.json.log
 pos_file     /path/to/jboss-eap-7.0/standalone/log/server.json.log.pos
 format       json
 tag          jboss.server
 time_key     timestamp
 time_format  %Y-%m-%dT%H:%M:%S.%L%z
</source>
<match jboss.server>
 @type stdout
</match>

FluentdのログにEAPのサーバログが出るようになりました。

$ tail -f /var/log/td-agent/td-agent.log 
2016-08-25 17:35:06 +0900 jboss.server: {"sequence":63,"loggerClassName":"org.jboss.logmanager.Logger","loggerName":"stdout","level":"INFO","threadName":"EJB default - 4","message":"TimeoutExample.scheduler() EJB timer service timeout at 2016.08.25 西暦 at 17:35:06 JST","threadId":125,"mdc":{},"ndc":""}
2016-08-25 17:35:09 +0900 jboss.server: {"sequence":64,"loggerClassName":"org.jboss.logmanager.Logger","loggerName":"stdout","level":"INFO","threadName":"EJB default - 5","message":"TimeoutExample.scheduler() EJB timer service timeout at 2016.08.25 西暦 at 17:35:09 JST","threadId":126,"mdc":{},"ndc":""}
2016-08-25 17:35:12 +0900 jboss.server: {"sequence":65,"loggerClassName":"org.jboss.logmanager.Logger","loggerName":"stdout","level":"INFO","threadName":"EJB default - 6","message":"ScheduleExample.doWork() invoked at 2016.08.25 西暦 at 17:35:12 JST","threadId":128,"mdc":{},"ndc":""}

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です