SLF4J&LogbackでLogging
前提
今のプロジェクトではサーバーサイドはJava(Tomcat)で書いています。
LoggingはSLF4J&Logbackを使っています。
ここを参考にlogback.xmlつくってます。
コピペで始めるSLF4J & Logback
あとはこの辺も参考にしています。
SLF4J+Logback 運用編
SLF4J+LOGBackでログレベル別に出力先を切り分けることは出来るの?
ログレベル
TRACE < DEBUG < INFO < WARN < ERROR
Logbackのタグ説明
appendar
出力のルールを記述する。このタグを書いただけでは、実際にログ出力は行われない。
logger
特定のパッケージ、クラス、識別名をどの出力ルールで出力するのかを記述する。
- additivity="false"を使うと、指定level以上はappender-ref出力ルールでのみ出力される。
- additivity="true"を使うと、rootタグの出力ルールでも出力される。
root
loggerで指定されていないものをどの出力ルールで出力するのかを記述する。
turboFilter
マーカーによって動作を変えることができる(らしい)。
Logbackを環境ごとに分ける
環境ごとにlogback.xmlを作成して、build時に適切な環境のlogback.xmlをパッケージングするようにしています。
config
L logback.develop.xml
L logback.stage.xml
L logback.release.xml
build.xml
<property name="mode" value="develop" />
<property name="classesdir" value="class" />
<property name="configdir" value="config" />
<target name="copy">
<copy overwrite="true" tofile="${classesdir}/logback.xml" file="${configdir}/logback.${mode}.xml"/>
</target>
その他
例外オブジェクトを渡すとトレースが出力される
try {
// HOGE;
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
debugは出力されなくても処理はされる
LEVEL=info以上を出力するようにしても、debugの処理は行われる。
で、以下のような処理は無駄なコストを払うことになるので注意。
logger.debug("HOGE:" + hoge.toString()); // 文字連結の処理が無駄になる
こういうのはisDebugEnabledで処理させないように書いておくのが吉。
if (logger.isDebugEnabled()) {
logger.debug("HOGE:" + hoge.toString());
}