2013-02-19 147 views
3

我想關閉一個類的方法的日誌記錄。 見下:log4j過濾掉方法

package com.mypackage; 

public class A { 
    public static void aaa() { 
     logger.info("hello"); 
    } 

    public static void bbb() { 
     logger.info("hello"); 
    } 
} 

# This works and nothing gets logged by A 
log4j.category.com.mypackage.A=off 

#this does not work. (I am trying to switch off only the static method) 
log4j.category.com.mypackage.A.aaa=off 

有誰知道我們是否可以在方法基礎上關閉(更改日誌級別)?

感謝

注:我不想改變代碼(這是因爲代碼已經是活着,我只是想改變現有的log4j這只是一個配置文件)

+0

您正在尋找面向方面公關ogramming。如果log4j處於當前狀態,則不能這樣做。 – 2013-02-19 17:19:40

+0

嗨Zo72你能給我一個簡單的例子如何記錄這個? MyQuestion(http://stackoverflow.com/questions/14973901/how-to-log-my-java-program-flow-in-database) – Ameer 2013-02-20 08:29:33

+0

@ameer太晚了......一些其他人已經回答了您的問題 – Zo72 2013-02-20 12:08:05

回答

1

我不知道有這樣做的可能性。

不過您可以配置日誌記錄,包括類和方法名(見PatternLayout),並與像「grep」包含/排除你想看看有什麼其他工具進行後處理的日誌文件。

由於性能問題,不建議記錄類和方法名稱,但這可能與您無關。

+0

@FvVaBe這是非常好的橫向思考非常感謝 – Zo72 2013-02-20 11:47:47

3

你可以做什麼有兩種不同的記錄器,每種方法一種。

private static final Logger logAAA = Logger.getLogger("some.logger.name.for.AAA"); 
private static final Logger logBBB = Logger.getLogger("some.other.name.for.BBB"); 

然後在您的配置爲它們定義不同的日誌級別。

+0

Delimanols謝謝,但這需要更改代碼,我不能 – Zo72 2013-02-20 08:26:25

+0

無法更改代碼。 – 2013-02-20 14:23:24

3

這實際上可以通過執行特定的Filter來檢查記錄器名稱和調用方法。您的過濾器會收到一個LoggingEvent,它允許使用類和方法名稱檢索LocationInfo

請注意,這將使用堆棧跟蹤上的反射,效率可能非常低,請謹慎操作。具體而言,首先檢查記錄器名稱,然後檢索LocationInfo,以便在必要時僅執行反射。

只有通過XML Log4j配置文件才能配置過濾器。

快速實現:

過濾器類:

public class MethodBasedFilter extends Filter { 

    @Override 
    public int decide(LoggingEvent event) { 
     if (event.getLoggerName().equals(LoggingWithMethodFiltering.class.getCanonicalName())) { 
      if (event.getLocationInformation().getMethodName().equals("filteredMethod")) { 
       return Filter.DENY; 
      } 
     } 
     return Filter.NEUTRAL; 
    } 
} 

的過濾類:

public class LoggingWithMethodFiltering { 
    private static final Logger LOG = Logger.getLogger(LoggingWithMethodFiltering.class); 

    public static void unfilteredMethod() { 
     LOG.info("I am not filtered"); 
    } 

    public static void filteredMethod() { 
     LOG.info("I am filtered and will never appear"); 
    } 

    public static void main(String[] args) { 
     unfilteredMethod(); 
     filteredMethod(); 
    } 
} 

log4j.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration> 

    <appender name="Console" class="org.apache.log4j.ConsoleAppender"> 
     <param name="threshold" value="trace" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p|%-20.20t|%d{HH:mm:ss,SSS}|%20.30c{1} %25.25F:%-4L - %20.20M - %m%n" /> 
     </layout> 
     <filter class="MethodBasedFilter" /> 
    </appender> 

    <root> 
     <level value="trace" /> 
     <appender-ref ref="Console" /> 
    </root> 

</log4j:configuration> 
+0

如果這可以實現而不需要更改代碼我很樂意使用XML log4j配置文件......請您充實您的答案並解釋 – Zo72 2013-02-20 11:48:53

+0

我添加了建議的解決方案的實現。當然,至少要添加過濾器實現,因爲沒有這種過濾器。根據您的環境,您可能需要將過濾器放置在Log4j jar旁邊的jar中,而不是應用程序本身中,以避免類加載問題(例如,如果Log4j由應用服務器提供) – 2013-02-20 13:55:20

+0

感謝您的努力,但嘿,那不是好,因爲它需要新的代碼... – Zo72 2013-02-20 17:25:41