struts2とseasar2でのlogging
このブログでは、struts2とseasar2を使ってアプリ作成をしようとしています。
(参考)
何も設定していない状態でもログは出されているようですが、明示的に設定を行ってみます。
struts2でのloggingについて
struts2では、SLF4J、commons-logging(log4J)、JDK Loggerをサポートしています。
いずれかのライブラリをpom.xmlで加えるか、直接WEB-INF/libにおくことで、そのライブラリを使うようになります。(JDK Loggerは標準です)
http://struts.apache.org/release/2.3.x/docs/logging.html
これまで、このブログではstruts(xwork)2.3.12を使ってきましたが、
ソースコードを見ると下記のようになっており複数のライブラリが使用可能状態になっている場合は、SLF4J=>commons-logging=>JDK Loggerの順に優先されて使用されるようです。
com.opensymphony.xwork2.util.logging.LoggerFactory
try { Class.forName("org.slf4j.LoggerFactory"); factory = new Slf4jLoggerFactory(); } catch (ClassNotFoundException ex) { //slf4j not found try commons LogFactory try { Class.forName("org.apache.commons.logging.LogFactory"); factory = new com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory(); } catch (ClassNotFoundException cnfex) { // commons logging not found, falling back to jdk logging factory = new JdkLoggerFactory(); } }
一方で、上記のstruts2のドキュメントを見てみると、
-Dxwork.loggerFactory=com.demo.MyLoggerFactory
のように指定すると上の優先順位を無視して指定したLoggerFactoryを使うことができるようです。
ただ、ソースコードを見たところどうやらこれはstruts2.3.14以降の話のようです。
また、2.3.14以降では優先順位もcommons-logging=>SLF4J=>JDK Loggerに変わっているようです。
Seasar2でのloggingについて
Seasar2ではlog4J(commons-logging)だけのようです。
http://s2container.seasar.org/2.4/ja/S2Logger.html
org.seasar.framework.log.Logger
log4J(commons-logging)の設定
今回はcommons-loggingを使おうと思います。
理由は、Struts2とSeasar2に共通するのがcommons-loggingだけだから。
ライブラリの追加
pom.xmlにライブラリを追加します。
なお、Seasar2をpom.xmlに加えた段階で依存関係のあるcommons-loggingも含まれています。
なので、log4Jを使用するに当たって、今回新たにpom.xmlに加える必要があるのはlog4jのみです。
ただし、seasar2に含まれるcommons-loggingは1.1で最新版は現時点で1.1.2なので今回はこちらも加えておきます。
pom.xml
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
commons-loggingについて
commons-logging自体は単なるインターフェースのため、今回はその実装としてlog4Jを使用します。
commons-loggingはlog4Jとセットで語られることが多いですが、他のログツールもサポートしています。(参考)
では、commons-loggingはどの実装を選択するかというロジックについてはこちらにかかれています。
log4J設定
設定はlog4j.propertiesファイルをクラスパス上に置くだけです。
今回は、src/main/resources/になります。
http://logging.apache.org/log4j/1.2/manual.html#Configuration
log4j.properties
# Set root logger level to DEBUG and its only appender to A1. log4j.rootLogger=INFO, A1 # A1 is set to be a ConsoleAppender. log4j.appender.A1=org.apache.log4j.ConsoleAppender # A1 uses PatternLayout. log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n
最初のlog4j.rootLoggerで出力する基本のログレベルを設定します。
ログレベルは、重要度の低いものからTRACE,DEBUG,INFO,WARN,ERROR,FATALです。
DEBUGにしてサーバ起動、画面アクセスをすると多くのメッセージがコンソールに表示されます。
このままでもいいんですが、今回はあまり重要でないものは表示させたくなかったのでINFOにしました。
ただし、一部の処理についてはログレベルを変えたいという場合もあります。
その場合は、log4j.logger.(パッケージ名)=(ログレベル)という行を追加します。
例えば、S2JDCから発行されるSQLをログに表示させたいという場合は、下記のようにすることで表示されるようになります。
log4j.logger.org.seasar.extension.jdbc=DEBUG
以上