こんにちは。平田です。
WildFly Swarmでログ出力設定を変更してみます。
WildFly Swarmは、Java EEアプリケーションを実行可能JARにパッケージングするフレームワークです。Spring BootやDropwizardのようなマイクロサービス向けフレームワークと似ていますが、Java EEでアプリを書くところが異なります。
ビルドするとWildFlyを組み込んだJARファイルが生成されますが、丸ごと入るわけでなくJava EEの機能のうち使っているものだけが同梱されます。とはいえ、サーブレットだけを使った場合でも30MBくらいのJARファイルになります。
また、Java EEの機能以外にもマイクロサービス向けの機能(サービスディスカバリ、監視、ログコレクタ、サーキットブレーカーなど)を組み込むことができます。
今回は、WildFly Swarmのサンプルを元に、ログ出力設定を変更してみます。デフォルトではINFOレベルのログが標準出力されますが、これをファイルに出してみます。まずサンプルをチェックアウトします。
$ git clone https://github.com/wildfly-swarm/wildfly-swarm-examples.git
次に、「static-shrinkwrap」サンプルをコピーします。このサンプルは静的HTMLファイルを同梱しただけの実行可能JARを作るもので凝った処理はないのですが、組み込みWildFlyの設定処理に関するサンプルコードが含まれているところがポイントです。
$ cd wildfly-swarm-examples/static $ cp -r static-shrinkwrap static-shrinkwrap-logging
まずpom.xmlを開き、アーティファクト名を修正してからloggingフラクションへの依存関係を指定します。フラクションとは、WildFly Swarmにおける着脱可能な機能のことで、使うものだけ指定します。基本的にWildFlyのサブシステムに相当するほか、前述のマイクロサービス向け機能も指定できます。
<artifactId>example-static-shrinkwrap-logging</artifactId> ... <dependency> <groupId>org.wildfly.swarm</groupId> <artifactId>logging</artifactId> </dependency>
次に、ログ出力設定処理を追記します。XML断片で宣言的に設定できますが、ここではJava APIを使います。
container .fraction(LoggingFraction .createDefaultLoggingFraction() .fileHandler("FILE", (h) -> { h.encoding(StandardCharsets.UTF_8.name()) .file(new HashMap<String, String>() {{ put("path", "/tmp/server.log"); }}); }) .rootLogger(Level.INFO, "FILE")) .start().deploy(deployment);
ラムダを使って記述します。ここでは、/tmp/server.logにログ出力しています。WildFly Swarmのドキュメントには書き方の説明が全く無いのですが、基本的にWildFlyのサブシステム設定と同じです。設定の詳細を調べるときはWildFly本体の管理設定マニュアルが参考になります。
ビルドして実行してみます。Mavenの親プロジェクトへの依存があるため、親プロジェクトごと全体をビルドします。テストをスキップしても相当時間がかかります。
$ cd path/to/wildfly-swarm-examples $ mvn -Dmaven.test.skip=true clean install
example-shrinkwrap-logging-swarm.jarが生成されるので、これを実行します。
$ cd static/static-shrinkwrap-logging/target $ java -jar example-static-shrinkwrap-logging.jar 15:46:09,736 INFO [org.jboss.msc] (main) JBoss MSC version 1.2.6.Final 15:46:09,852 INFO [org.jboss.as] (MSC service thread 1-6) WFLYSRV0049: WildFly Core 2.0.10.Final "Kenny" starting
二行だけ標準出力に出てしまっていますね…。おそらくloggingフラクションの設定が有効になるまでのものだと思います。/tmp/server.logにもログが出ているはずです。
java -jarで実行できるというのは魅力的です。開発者のセットアップもIDEでのデバッグも配布もミドルウェアアップデートも単純になります。Red Hat者はコンテナ、マイクロサービス、DevOpsを推進したいようなので、WildFly Swarmもそのうちサポートされるのでしょう。