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]