2011-12-27 6 views
4

ログレベルはINFOに設定されていますが、SLF4Jはまだその式を評価しているようです。SLF4J-Log4Jはロギングを無効にしていないようです

package com.ab.test.slf4j; 

import org.apache.log4j.PropertyConfigurator; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class SimpleTest { 
    static final Logger logger = LoggerFactory.getLogger(SimpleTest.class); 

    public static void main(String[] args) { 
     PropertyConfigurator.configure("log4j.properties"); 

     logger.debug("Test " + testEnter()); 

     logger.debug("Test {}", testEnter()); 
    } 

    public static String testEnter() { 
     System.out 
       .println("If you see this it means your expression is evaluated :("); 

     return "test"; 
    } 
} 

Log4Jのプロパティファイル:

log4j.rootLogger=INFO, CA 
log4j.appender.CA=org.apache.log4j.ConsoleAppender 
log4j.appender.CA.layout=org.apache.log4j.PatternLayout 
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n 

実行出力:

If you see this it means your expression is evaluated :(
If you see this it means your expression is evaluated :(

EDITは:見られるように、走行出力を改正、式が評価され、しかし、ログメッセージではありません。式は次のように評価されるべきではありませんSLF4J's "Performance Logging"

+0

私はslf4j-log4j12-1.6.4.jar、slf4j-api-1.6.4.jarおよびlog4j-1.2.16.jar –

+0

を持っています。私は出力を修正しました。 –

答えて

6

slf4jではなく、JVMは関数呼び出しの前に渡された各パラメータを計算する必要があります。

より適切なリンクをお読みください。 slf4jはスキップされたログステートメントのObject paramsのtoString()の呼び出しをスキップします。関数呼び出しをスキップするためには機能しません。

しかし、あなたは、このためのカスタムファンクタのオブジェクトを作成することができます。

logger.debug(new Object() { 
     @Override 
     public String toString() { 
      return "some expensive test data"; 
     } 
    }); 

のtoString()メソッドは、デバッグがスキップされていない場合にのみ呼び出されます。

+0

例を使って答えを更新しました。 – Vadzim

+0

ありがとうございました。 –

関連する問題