【Tips】Spring Bootの1プロジェクトでWEBアプリとバッチを共存させつつ、バッチだけログ出力を標準出力にする

はじめに

SpringBootのプロジェクトでWEBアプリとバッチを共存させ、なおかつバッチだけログを標準出力で出したいのです!
と、なったときにいろいろと検索してみたけど、上記を実現する方法がなかなか見つけれらず困っていた時、ある人のアドバイスで解決することができたのでそれを今回の記事にしたいと思います。

使用ライブラリ / バージョン

SpringBoot:2.3.3
Logback:1.2.3(Spring Boot Starter Parent内包のものをそのまま利用)
janino:3.1.2(Spring Boot Starter Parent内包のものをそのまま利用)

WEBアプリとバッチを共存させる

①起動時に引数によって、起動するアプリ(WEB / バッチ)を判定するMainクラスを作成する。

WEBアプリとバッチのMainクラスをラップしたEntryPointを作成します。
EntryPointの役割としては、引数に応じて実行するMainクラスを振り分けるだけのシンプルなクラスです。
下記サンプルソースは引数が
・"web"の場合はWEBアプリ
・"batch"の場合はバッチ
を起動するためのMainクラスとなります。
※WEBアプリ / バッチのMainの紹介は今回の記事からは割愛します。

public class EntryPoint {

    public static void main(String[] args) throws Exception {
        if (args != null && args.length > 0 && "web".equals(args[0])) {
            Application.main(args);
            return;
        }
        if (args != null && args.length > 0 && "batch".equals(args[0])) {
            System.setProperty("app", "batch"); // 環境変数を設定
            BatchMain.main(args);
        }
    }
}

9行目のSystem.setPropertyで環境設定を追加しているところがポイントです!

②jar実行時のイメージ

// WEBアプリ
java -Dspring.profiles.active=xxxx <java options> -jar Xxxxxxx.jar web

// バッチ
java -Dspring.profiles.active=xxxx <java options> <-Dspring.batch.job.names=xxxx> -jar Xxxxxxx.jar batch

profilesやJavaOptionsなどは必要に応じて設定してください。

バッチだけログを標準出力にする

使用するライブラリ:janino

Janino is a super-small, super-fast Java compiler.

引用元:http://janino-compiler.github.io/janino/

janinoを使用することでlogback.xmlに条件式を記入すること可能となり、
EntryPointで設定した環境変数を使用して、標準出力するための条件分岐を加えます。

では早速やっていきましょう。
pom.xmlに依存関係を追加し、logback.xmlを修正するだけでバッチだけ標準出力にすることが可能です!

pom.xml

  <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
  </dependency>

logback.xml

  <root level="INFO">
    <!-- 必要に応じてAppenderを指定 -->
    <appender-ref ref="XXXXX" />
    <if condition='p("app").equals("batch")'>
        <then>
            <appender-ref ref="STDOUT" />
        </then>
    </if>
  </root>

最後に

いかがでしたでしょうか?
今回はWEBアプリとバッチの共存をテーマにjaninoの使い方を紹介しましたが、「環境別でxxxxしたい!」という時にもjaninoを使用することでスマートなログ生活ができるようになれるかもしれないですね♪

janinoは強力なライブラリであることは間違いないですが、便利すぎるがゆえに多用し過ぎて複雑な設計にならないように注意しましょう。

また時間ができたら、SpringBoot関連のTipsを書いていこうと思います。

最後まで記事を読んでいただき、ありがとうございました。