Scala Liftでlogを細かく制御したい。みたいな場合、LiftのロギングフレームワークはSLF4Jなので、Log4jではなくLogbackを使うことにした。
SLF4JとLogbackに関してはこちらを参考に
http://d.hatena.ne.jp/yohjizzz/searchdiary?word=*[slf4j]Liftでのロギングの書き方
何種類かの書き方があるが、代表的なものはこんな感じ。
| //パターン1 trait MyService extends Logger { info("Creating MyService at %s".format(now)) }
//パターン2 trait MyService extends Loggable { logger.info("Creating MyService at %s".format(now)) }
//ロガーを指定する trait MyService { val logger = Logger("forFile) logger.info("Creating MyService at %s".format(now)) }
|
これでJettyを起動すると、標準出力に記述したログが出てくる。
pom.xmlに依存関係を追加
まずはLogback用の記述を追加する。
| <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>0.9.28</version> </dependency>
|
これで準備完了。
あとは、細かい設定をしていく作業。
ogback.xmlの作成
logbackでは設定はlogback.xmlに書くと相場で決まっているが、liftの場合はdefault.logback.xmlを/propsに作成するのが一般的のようだ。
実際に下記のようなxmlを作成してみる。
| <configuration debug="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <Target>System.out</Target> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern> </layout> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/app.log</file> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>[%date],%msg%n</Pattern> </layout> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>logs/app.%d{yyyy-MM-dd}.zip</FileNamePattern> </rollingPolicy> </appender> <logger name="forfile"> <level value="INFO" /> <appender-ref ref="FILE" /> </logger>
<root> <level value="INFO" /> <appender-ref ref="STDOUT" /> </root> </configuration>
|
WARNレベルのログが標準出力に表示され、forFileのロガー指定のログは/logs/app.logに出力される。
またapp.logはデイリーでローテートされ、zipに圧縮される設定。
環境による設定の変更
logback.xmlは環境によって切り替えることができる。
基本的にpropsファイルと同様の方法で切り替えることができる。
http://d.hatena.ne.jp/perezvon/20090912/1252720173上記のページにあるように
{run.mode}.{user}.{hostname}.logback.xml
{run.mode}.{user}.logback.xml
{run.mode}.{hostname}.logback.xml
{run.mode}.default.logback.xml
みたいなファイル名に設定し、JVMの起動オプションで-Drun.mode=productionのように指定してあげればOK。
便利だなー