jsf log4jロゴ、幅= 264、高さ= 80

このチュートリアルでは、log4jフレームワークをJSF 2.x Webアプリケーションと統合する方法を説明します。 JSFは

java.util.logging`を使用していますが、JSFの

java.util.logging`から `log4j`へのロギングをリダイレクトするために余分な作業が必要です。深刻なhttp://www.slf4j.org/legacy.html# jul-to-slf4j[パフォーマンスのペナルティ]は、ローカル開発やデバッグ環境でのみ使用してください。

プロジェクト環境を確認する:

  1. SLF4j 1.7.7

  2. Log4j 1.2.17

  3. JSF 2.2.7

  4. Maven 3

  5. Tomcat 6

  6. Eclipseケプラー4.3

JSFとlog4jを簡単に統合する手順。

  1. `logging.properties`のJSFログを有効にしてください.

Eclipse環境内で実行すると、Eclipseの `JRE/lib/logging.properties`が使用されます。

  1. `log4j.properties`を作成し、それをクラスパスに置きます.

  2. サーブレットのリスナーを作成し、 `slf4j bridge handler`をインストールします

ログをjava.util.loggingからlog4jにリダイレクトします。

1.プロジェクトディレクトリ

最終的なプロジェクトの構造を見直します。


jsf-log4j-directory、width = 430、height = 396

プロジェクトの依存関係

あなたは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アプリケーションを実行し、デフォルトのページにアクセスし、ボタンをクリックします。


jsf-log4j-demo、width = 551、height = 338


8.1

JSFとアプリケーションの両方のログがコンソールに表示されます。

画像://wp-content/uploads/2014/07/jsf-log4j-eclipse.png[jsfログインコンソール、幅= 640、高さ= 478]


Figure:Eclipseコンソール


8.2

JSFとアプリケーションログの両方が `$ {tomcat} \ logs \ jsfapp.log`に記録されます。


jsfログインファイル、幅= 641、高さ= 559


Figure:D:\ apache-tomcat-6.0.37 \ logs \ jsfapp.log

ソースコードをダウンロードする

ダウンロードする –

JSFAndLog4j.zip

(12 KB)