JSF 2 Log4j統合の例

このチュートリアルでは、log4jフレームワークをJSF 2.x Webアプリケーションと統合する方法を説明します。 JSFは
java.util.logging`を使用していますが、JSFの
java.util.logging`から `log4j`へのロギングをリダイレクトするために余分な作業が必要です。深刻なhttp://www.slf4j.org/legacy.html# jul-to-slf4j[パフォーマンスのペナルティ]は、ローカル開発やデバッグ環境でのみ使用してください。
プロジェクト環境を確認する:
-
SLF4j 1.7.7
-
Log4j 1.2.17
-
JSF 2.2.7
-
Maven 3
-
Tomcat 6
-
Eclipseケプラー4.3
JSFとlog4jを簡単に統合する手順。
-
`logging.properties`のJSFログを有効にしてください.
Eclipse環境内で実行すると、Eclipseの `JRE/lib/logging.properties`が使用されます。
-
`log4j.properties`を作成し、それをクラスパスに置きます.
-
サーブレットのリスナーを作成し、 `slf4j bridge handler`をインストールします
ログをjava.util.loggingからlog4jにリダイレクトします。
1.プロジェクトディレクトリ
最終的なプロジェクトの構造を見直します。

プロジェクトの依存関係
あなたはslf4j-log4j12とjul-to-slf4jが必要です。
pom.xml
<properties>
<jdk.version>1.7</jdk.version>
<jsf.version>2.2.7</jsf.version>
<slf4j.version>1.7.7</slf4j.version>
</properties>
<dependencies>
<!-- from java.util.logging to log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- it help to get slf4j and log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- JSF -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>${jsf.version}</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>${jsf.version}</version>
</dependency>
<!-- you need this in web -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
4. JSFロギング
このプロジェクトはEclipseの環境内で実行されているため、EclipseのJREが使用されます。
logging.properties`を開き、レベルをFINESTに変更し、
javax.faces`と `com.sun.faces`のログを有効にしてください:
$ \ {JRE__PATH}/lib/logging.properties
# Default is INFO, change it to FINNEST #java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.level = FINEST java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter #Add these two lines to enable JSF logging javax.faces.level = FINEST com.sun.faces.level = FINEST
java.util.logging levels
を参照してください。
-
Note ** このプロジェクトがTomcatに直接デプロイされている場合は、この `$ {Tomcat} \ conf \ logging.properties`を更新してください
5. Log4jロギング
log4jプロパティファイルを作成し、それを `resources`フォルダに入れます。ステップ1を参照してください。
log4j.properties
# Root logger option
log4j.rootLogger=WARN, console, file
#enable JSF logging
log4j.logger.javax.faces=DEBUG
log4j.logger.com.sun.faces=DEBUG
# Redirect log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Redirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${catalina.home}/logs/jsfapp.log
log4j.appender.file.MaxFileSize=5KB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
6. ServletContextListener
JSFのログを
java.util.properties`から
log4j`にリダイレクトするために、ブリッジハンドラをインストールするサーブレットリスナを作成します。
MyListener
package com.mkyong.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.slf4j.bridge.SLF4JBridgeHandler;
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent arg) {
System.out.println("contextInitialized....");
//remove the jsf root logger, avoid duplicated logging
//try comment out this and see the different on the console
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}
@Override
public void contextDestroyed(ServletContextEvent arg) {
System.out.println("contextDestroyed....");
}
}
リスナークラスとその他の標準JSF設定を含めます。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app__2__5.xsd"
id="WebApp__ID" version="2.5">
<display-name>JavaServerFacesAndLog4j</display-name>
<context-param>
<param-name>javax.faces.PROJECT__STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
<!-- Install slf4j bridge handler -->
<listener>
<listener-class>
com.mkyong.listener.MyListener
</listener-class>
</listener>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/** </url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>** .jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>** .faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>** .xhtml</url-pattern>
</servlet-mapping>
</web-app>
7.アプリケーションログ
log4jのロギングの方法を示す簡単な例です。
WelcomeAction.java
package com.mkyong.controller;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.apache.log4j.Logger;
@ManagedBean
@SessionScoped
public class PageController implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(PageController.class);
public String process() {
//logs debug
if (logger.isDebugEnabled()) {
logger.debug("PageController.process()");
}
//logs exception
logger.error("This is Error message", new Exception("Testing"));
return "success";
}
}
単純なJSFビュー・リソース。
pages/welcome.jsp
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<h1>JSF 2.0 + Log4j</h1>
<h:form>
<h:commandButton action="#{pageController.process}" value="Click Me"/>
</h:form>
</h:body>
</html>
8.デモ
JSF Webアプリケーションを実行し、デフォルトのページにアクセスし、ボタンをクリックします。

8.1
JSFとアプリケーションの両方のログがコンソールに表示されます。
画像://wp-content/uploads/2014/07/jsf-log4j-eclipse.png[jsfログインコンソール、幅= 640、高さ= 478]
Figure:Eclipseコンソール
8.2
JSFとアプリケーションログの両方が `$ {tomcat} \ logs \ jsfapp.log`に記録されます。

Figure:D:\ apache-tomcat-6.0.37 \ logs \ jsfapp.log
ソースコードをダウンロードする
ダウンロードする –
JSFAndLog4j.zip
(12 KB)
参考文献
: Why are the Level.FINE logging messages not showing?].
http://stackoverflow.com/questions/7363704/jsf2-logs-with-tomcat
[Stackover
: JSF2 logs with tomcat].
http://blog.cn-consult.dk/2009/03/bridging-javautillogging-to-slf4j.html
[Bridging
SLF4Jへのjava.util.logging]。
log4j 1.2公式ページ
: java.util.logging]