こんにちは。平田です。
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":""}