JSF 2 Log4j統合の例

JSF 2 + Log4j統合の例

jsf log4j logo

このチュートリアルでは、log4jフレームワークをJSF 2.x Webアプリケーションと統合する方法を示します。 JSFはjava.util.loggingを使用しています。ログをJSFのjava.util.loggingからlog4jにリダイレクトするには、追加の作業が必要です。深刻なpenalty of performanceを使用する場合は、ローカル開発中にのみこのトリックを使用するようにしてください。デバッグ環境。

プロジェクト環境を確認します。

  1. SLF4j 1.7.7

  2. Log4j 1.2.17

  3. JSF 2.2.7

  4. メーベン3

  5. トムキャット6

  6. Eclipseケプラー4.3

要するに、JSFとlog4jを統合する手順。

  1. logging.propertiesでJSFロギングをオンにします。このプロジェクトはEclipse環境内で実行されているため、EclipseのJRE/lib/logging.propertiesが使用されます。

  2. log4j.propertiesを作成し、クラスパスに配置します。

  3. サーブレットのリスナーを作成し、slf4j bridge handlerをインストールして、ロギングをjava.util.loggingからlog4jにリダイレクトします。

Note
このSLF4j Bridging legacy APIsを参照してください

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

最終的なプロジェクト構造を確認します。

jsf-log4j-directory

2. プロジェクトの依存関係

slf4j-log4j12とjul-to-slf4jが必要です。

pom.xml

    
        1.7
        2.2.7
        1.7.7
    

    

        
        
            org.slf4j
            jul-to-slf4j
            ${slf4j.version}
        

        
        
            org.slf4j
            slf4j-log4j12
            ${slf4j.version}
        

        
        
            com.sun.faces
            jsf-api
            ${jsf.version}
        
        
            com.sun.faces
            jsf-impl
            ${jsf.version}
        

        
        
            javax.servlet
            servlet-api
            2.5
        

    

4. JSFロギング

このプロジェクトはEclipseの環境内で実行されているため、EclipseのJREが使用されます。 logging.propertiesを開き、レベルをFINESTに変更して、javax.facescom.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.example.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


    JavaServerFacesAndLog4j

    
        javax.faces.PROJECT_STAGE
        Development
    
    
        faces/index.xhtml
    

    
    
        
                com.example.listener.MyListener
          
    

    
        Faces Servlet
        javax.faces.webapp.FacesServlet
        1
    
    
        Faces Servlet
        /faces/*
    
    
        Faces Servlet
        *.jsf
    
    
        Faces Servlet
        *.faces
    
    
        Faces Servlet
        *.xhtml
    

7. アプリケーションロギング

log4jのロギングを行う方法を示す簡単な例。

WelcomeAction.java

package com.example.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





    

JSF 2.0 + Log4j

8. Demo

JSF Webアプリケーションを実行し、デフォルトページにアクセスして、ボタンをクリックします。

jsf-log4j-demo

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

jsf logging in console

図:Eclipseコンソール

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

jsf logging in file

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

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

ダウンロード–JSFAndLog4j.zip(12 KB)