Don't Repeat Yourself

Don't Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of all kinds. -- wikipedia

logback で環境ごとにロギング設定を変えたい場合にやること

ググると Spring も込みの設定方法しか出てこなかったので,メモしておきます.言語は Scala,ビルドツールは sbt を使用しています.logback-classic を使用しているようです.

やろうとしていること

  • logback.xml 内で,開発環境/ステージング環境/本番環境それぞれでログの仕方を切り替えたい場合
  • かつ,環境情報は System.setProperty(key, value) あるいは環境変数で設定されている場合

ハマったポイント

  • ドキュメントどおりに if 文を書いてみる.
  • 環境変数システムプロパティを正しく設定しているのに,なぜか <if condition='p("key").contains("value")'> がうまく効いていない.
  • それゆえ,if 文の内容がいつまで経っても反映されない.

原因

  • ログ上に出ている警告を注意深く読むと,「janino」というライブラリがクラスパスにないと言われる (知らんがな).

解決策

  • janino というライブラリを Maven や sbt で依存関係に加えておく.

一応,このページ の if 文の箇所に,

Note that conditional processing requires the Janino library.

とは書いてありますね.Janino Library の設定方法まで丁寧に書いてあります

お役に立ちますと幸いでございます.ちなみにいろいろ試して,30分くらい溶かしました.エラーメッセージは丹念に読みましょう.

ちなみに

この構文で取得できる p("key") の参照先は,システムプロパティでもよいですし,環境変数でもよいです.

システムプロパティであれば,java jar xxx.jar -DENV=dev などと書けば (あるいは System#setProperty を用いる手もあります), p("ENV").contains("dev")dev という値かどうか判定できます..また,環境変数であれば,環境変数ENV=dev とセットしたあとに同様に p("ENV").contains("dev") で判定可能です.