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はどの実装を選択するかというロジックについてはこちらにかかれています。

  • commons-logging.propertiesファイルに「org.apache.commons.logging.Log=(クラス名)」で指定されている場合はそのクラス
  • システムプロパティで指定されている場合はそのクラス
  • log4Jが利用可能(クラスパスに含まれている)場合はlog4Jを使用
  • JDK 1.4 loggingが利用可能であればそれを使用
  • 上記のいずれにも該当しない場合はcommons-loggingに同梱されているSimpleLogが使用される

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

以上