2011-12-13 56 views
52

我想添加日誌記錄到我正在開發的應用程序,使用apache log4j。在這一點上,我想重定向所有級別INFO的日誌消息,並且將(TRACE,DEBUG)的所有日誌消息重定向到標準輸出以及WARN和以上(錯誤,致命)的所有其他日誌消息到stderr。 例如:記錄錯誤到stderr和調試,信息到標準輸出log4j

... 
logger.info("Processing at some point"); // must be written to stdout 
logger.debug("Point x was processed"); // must be written to stdout 
logger.warn("Incorrect point config"); // must be written only to stderr 
logger.error("Exception occurred at point x"); // must be written only to stderr 

那麼應該怎麼我的log4j.properties文件?它在這裏是怎樣看待這個momment:

log4j.rootLogger=DEBUG, stdout, stderr 

# configure stdout 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stdout = org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Threshold = DEBUG 
log4j.appender.stdout.Target = System.out 
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 

# configure stderr 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stderr = org.apache.log4j.ConsoleAppender 
log4j.appender.stderr.Threshold = WARN 
log4j.appender.stderr.Target = System.err 
log4j.appender.stderr.layout = org.apache.log4j.PatternLayout 
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 

具有上述配置的問題是,logger.error()...在標準輸出打印了。

回答

9

每喬恩斯基特以前的帖子在Post

unfortunately there is no maximum threshold, so wherever you get debug messages, you also get warning messages. That's a bit of a pain, IMO.

+0

謝謝你的快速回復。是否有任何方法來繼承appender(例如stdout appender),所以當INFO以上的日誌會被拒絕?過濾器怎麼樣:爲stdout設置一個過濾器,以便只接受TRACE,DEBUG,INFO的日誌? – Elvis

+0

絕對如此。您可以創建自己的appender並在配置文件中指向它。 –

+1

這裏是一個示例(在xml配置中)http://stackoverflow.com/questions/4825072/how-to-set-filter-in-the-log4j-xml,因此與以下示例相同:log4j.appender.stdout。 Filter = org.apache.varia.LevelRangeFilter log4j.appender.stdout.Filter.LevelMax = INFO log4j.appender.stdout.Filter.LevelMin = TRACE?如果是這樣,它似乎不適用於我的情況。 log4j引發了一個警告消息,告訴過濾器不能被設置... – Elvis

45

解決下面還屬性文件格式。訣竅是讓過濾器定義正確。 Log4j properties info here

原來的嘗試,修改過濾WARN &錯誤:

log4j.rootLogger=TRACE, stdout, stderr 

# configure stdout 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stdout = org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Threshold = TRACE 
log4j.appender.stdout.Target = System.out 
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 
log4j.appender.stdout.filter.filter1=org.apache.log4j.varia.LevelRangeFilter 
log4j.appender.stdout.filter.filter1.levelMin=TRACE 
log4j.appender.stdout.filter.filter1.levelMax=INFO 

# configure stderr 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stderr = org.apache.log4j.ConsoleAppender 
log4j.appender.stderr.Threshold = WARN 
log4j.appender.stderr.Target = System.err 
log4j.appender.stderr.layout = org.apache.log4j.PatternLayout 
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 
+0

你確定過濾器可以被應用到第一個appender嗎?我沒有使用任何運氣。屬性文件 –

+0

這個解決方案適用於我,也許這應該被標記爲解決方案而不是由約翰B提供的答案 – Stefan

5
  1. 而不是使用的.properties配置,您必須使用.xml配置。
  2. 在.xml配置文件中放入一個名爲「filter」的類型爲「org.apache.log4j.varia.LevelRangeFilter」的元素,並設置其參數LevelMaxLevelMin

例如,下面的.xml配置定義了兩個appender:stdout,stderr。 stdout會將所有級別小於或等於INFO的日誌打印到stdout,並且stderr會將所有級別大於INFO的日誌打印到stderr。

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
    Document : log4j.xml 
    Created on : 13 Δεκέμβριος 2011, 3:55 μμ 
    Author  : elitex 
    Description : Purpose of the document follows. 
--> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 
<log4j:configuration> 
    <appender name="stderr" class="org.apache.log4j.ConsoleAppender"> 
     <param name="threshold" value="warn" /> 
     <param name="target" value="System.err"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" /> 
     </layout> 
    </appender> 
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> 
     <param name="threshold" value="debug" /> 
     <param name="target" value="System.out"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" /> 
     </layout> 
     <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
      <param name="LevelMin" value="debug" /> 
      <param name="LevelMax" value="info" /> 
     </filter> 
    </appender> 
    <root> 
     <priority value="debug"></priority> 
     <appender-ref ref="stderr" /> 
     <appender-ref ref="stdout" /> 
    </root> 
</log4j:configuration> 

欲瞭解更多信息看:http://www.laliluna.de/articles/posts/log4j-tutorial.html

1

另一個例子利用log4j2的ThresholdFilter標記。

<Console name="ConsoleERR" target="SYSTEM_ERR"> 
    <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/> 
    <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> 
</Console> 

請參閱doc

0

這是的logback配置這不正是你問什麼(!):

<?xml version="1.0" encoding="UTF-8"?> 
<configuration debug="true" scan="true" scanPeriod="30 seconds"> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <target>System.out</target> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>INFO</level> 
      <onMatch>ACCEPT</onMatch> 
      <onMismatch>DENY</onMismatch> 
     </filter> 
     <encoder> 
      <pattern> 
       %-4relative [%thread] %-5level %logger - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender"> 
     <target>System.err</target> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>WARN</level> 
     </filter> 
     <encoder> 
      <pattern> 
       %-4relative [%thread] %-5level %logger - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <root level="${LOGBACK_ROOT_LEVEL:-INFO}"> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="STDERR" /> 
    </root> 

</configuration> 
+0

不,我很抱歉,它也過濾掉跟蹤和調試消息 – Thirdman

相關問題