2011-04-13 98 views
111

如何將Logback配置爲將記錄器的不同級別記錄到不同的目的地?如何配置Logback以將記錄器的不同級別記錄到不同的目標?

例如,給定以下的logback配置,將記錄的logback INFO消息STDOUTERROR消息STDERR

(請注意,此示例是Chapter 3: Logback Configuration中顯示的示例logback-examples/src/main/java/chapters/configuration/sample4.xml的變體)。

<configuration> 
    <appender name="STDOUT" 
    class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
    <pattern> 
     %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 
     </pattern> 
    </encoder> 
    </appender> 
    <appender name="STDERR" 
    class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
    <pattern> 
     %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 
     </pattern> 
    </encoder> 
    <target>System.err</target> 
    </appender> 
    <!-- What is the effective level of "chapters.configuration"? --> 
    <logger name="chapters.configuration" level="INFO" additivity="false"> 
    <appender-ref ref="STDOUT" /> 
    </logger> 
    <logger name="chapters.configuration" level="ERROR" additivity="false"> 
    <appender-ref ref="STDERR" /> 
    </logger> 

    <!-- turn OFF all logging (children can override) --> 
    <root level="OFF"> 
    <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 
+1

配置 - 較高的:),但嚴重的是,什麼你的控制檯/標準輸出說你是否登錄兩個級別? – kostja 2011-04-13 17:23:16

+0

關於第二個想法,我認爲我更感興趣回答的問題是,「如何將記錄器的不同級別記錄到不同的目的地」? – 2011-04-13 17:45:36

+0

您可能會喜歡我創建的[filter](http://stackoverflow.com/q/24141208/581205)。 – maaartinus 2014-06-14 19:22:07

回答

57

更新:對於使用Groovy的所有基於配置的方法,請參見Dean Hiller's answer

-

你可以做一些有趣的事情Logback filters。下面的配置將只打印警告和錯誤消息到stderr,而其他所有內容都會打印到stdout。

logback.xml

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 
    <target>System.out</target> 
    <filter class="com.foo.StdOutFilter" /> 
    ... 
</appender> 

<appender name="stderr" class="ch.qos.logback.core.ConsoleAppender"> 
    <target>System.err</target> 
    <filter class="com.foo.ErrOutFilter" /> 
    ... 
</appender> 

<logger name="mylogger" level="debug"> 
    <appender-ref ref="stdout" /> 
    <appender-ref ref="stderr" /> 
</logger> 

com.foo.StdOutFilter

public class StdOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter 
{ 

    @Override 
    public FilterReply decide(Object event) 
    { 
     if (!isStarted()) 
     { 
      return FilterReply.NEUTRAL; 
     } 

     LoggingEvent loggingEvent = (LoggingEvent) event; 

     List<Level> eventsToKeep = Arrays.asList(Level.TRACE, Level.DEBUG, Level.INFO); 
     if (eventsToKeep.contains(loggingEvent.getLevel())) 
     { 
      return FilterReply.NEUTRAL; 
     } 
     else 
     { 
      return FilterReply.DENY; 
     } 
    } 

} 

com.foo.ErrOutFilter

public class ErrOutFilter extends ch.qos.logback.core.filter.AbstractMatcherFilter 
{ 

    @Override 
    public FilterReply decide(Object event) 
    { 
     if (!isStarted()) 
     { 
      return FilterReply.NEUTRAL; 
     } 

     LoggingEvent loggingEvent = (LoggingEvent) event; 

     List<Level> eventsToKeep = Arrays.asList(Level.WARN, Level.ERROR); 
     if (eventsToKeep.contains(loggingEvent.getLevel())) 
     { 
      return FilterReply.NEUTRAL; 
     } 
     else 
     { 
      return FilterReply.DENY; 
     } 
    } 

} 
+4

你也可以使用http://logback.qos.ch/manual/filters.html#levelFilter,它將爲你實現類。 – Dejell 2011-11-06 06:47:58

+0

@Odelya是的,你可以使用級別過濾器,但你需要定義多個過濾器,因爲配置只接受SINGLE級別偵聽。 – 2011-11-07 19:23:09

+0

你是對的 - 我最後寫了我自己的實現,但只有一個篩選器,而不是2.我的篩選器檢索級別字符串作爲參數 – Dejell 2011-11-07 19:41:54

7

我使用logback.groovy配置我的logback,但你可以用XML配置做得一樣好:

import static ch.qos.logback.classic.Level.* 
import static ch.qos.logback.core.spi.FilterReply.DENY 
import static ch.qos.logback.core.spi.FilterReply.NEUTRAL 
import ch.qos.logback.classic.boolex.GEventEvaluator 
import ch.qos.logback.classic.encoder.PatternLayoutEncoder 
import ch.qos.logback.core.ConsoleAppender 
import ch.qos.logback.core.filter.EvaluatorFilter 

def patternExpression = "%date{ISO8601} [%5level] %msg%n" 

appender("STDERR", ConsoleAppender) { 
    filter(EvaluatorFilter) { 
     evaluator(GEventEvaluator) { 
     expression = 'e.level.toInt() >= WARN.toInt()' 
     } 
     onMatch = NEUTRAL 
     onMismatch = DENY 
    } 
    encoder(PatternLayoutEncoder) { 
     pattern = patternExpression 
    } 
    target = "System.err" 
    } 

appender("STDOUT", ConsoleAppender) { 
    filter(EvaluatorFilter) { 
     evaluator(GEventEvaluator) { 
     expression = 'e.level.toInt() < WARN.toInt()' 
     } 
     onMismatch = DENY 
     onMatch = NEUTRAL 
    } 
    encoder(PatternLayoutEncoder) { 
     pattern = patternExpression 
    } 
    target = "System.out" 
} 

logger("org.hibernate.type", WARN) 
logger("org.hibernate", WARN) 
logger("org.springframework", WARN) 

root(INFO,["STDERR","STDOUT"]) 

我想用GEventEvaluator是simplier因爲沒有必要創建過濾器類。
我爲我的英文道歉!

26

好吧,這裏是我最喜歡的xml方法。我這樣做的Eclipse版本,所以我可以

  • 點擊的東西帶我到日誌報表和
  • 看到的信息和下面的黑色和紅色

和警告/嚴重某種原因,SO沒有正確顯示這一切,但大多數似乎在那裏......

<configuration scan="true" scanPeriod="30 seconds"> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <filter class="ch.qos.logback.core.filter.EvaluatorFilter">  
      <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
      <expression> 
       e.level.toInt() &lt;= INFO.toInt() 
      </expression> 
      </evaluator> 
      <OnMismatch>DENY</OnMismatch> 
      <OnMatch>NEUTRAL</OnMatch> 
     </filter> 

     <encoder> 
      <pattern>%date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender"> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>warn</level> 
     </filter> 

     <encoder> 
      <pattern>%date{ISO8601} %X{sessionid}-%X{user} %caller{1} %-4level: %message%n</pattern> 
     </encoder> 
     <target>System.err</target> 
    </appender> 

    <root> 
     <level value="INFO" /> 
     <appender-ref ref="STDOUT"/> 
     <appender-ref ref="STDERR"/> 
    </root> 
</configuration> 
+0

這是將跟蹤調試信息與警告和錯誤分開的最佳過濾解決方案 – iwalktheline 2016-04-20 13:12:33

10

如此配置,我使用,它工作得很好,它是基於XML + JaninoEventEvaluator(需要Janino庫添加到類路徑)

<configuration> 
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%date | [%-5level] in [%file:%line] - %msg %n</pattern> 
    </encoder> 
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 
     <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"> 
      <expression> 
       level &lt;= INFO 
      </expression> 
     </evaluator> 
     <OnMismatch>DENY</OnMismatch> 
     <OnMatch>NEUTRAL</OnMatch> 
    </filter> 
</appender> 
<appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender"> 
    <target>System.err</target> 
    <encoder> 
     <pattern>%date | [%-5level] in [%file:%line] - %msg %n</pattern> 
    </encoder> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>WARN</level> 
    </filter> 
</appender> 

<root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
    <appender-ref ref="STDERR" /> 
</root> 
</configuration> 
65

我相信這將是簡單的解決方法:只根據配置

<configuration> 
    <contextName>selenium-plugin</contextName> 
    <!-- Logging configuration --> 
    <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>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] %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.LevelFilter"> 
      <level>ERROR</level> 
      <onMatch>ACCEPT</onMatch> 
      <onMismatch>DENY</onMismatch> 
     </filter> 
     <encoder> 
      <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] %logger{10} [%file:%line] %msg%n</pattern> 
     </encoder> 
    </appender> 
    <root level="INFO"> 
     <appender-ref ref="STDOUT"/> 
     <appender-ref ref="STDERR" /> 
    </root> 
</configuration> 
+27

您想改爲使用ThresholdFilter。 – 2013-09-30 11:39:46

+0

是的,那只有當你想要信息,調試和跟蹤記錄到標準輸出時纔會有信息級別,但是卻被忽略了,對吧? – 2015-02-24 20:36:21

+0

這吃了調試和跟蹤? – Stefan 2015-03-18 12:51:23

17

解決方案,具有ThresoldFilter和LevelFilters讓事情變得非常簡單明白:

<configuration> 
    <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>%date %level [%thread] %logger %msg%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <target>System.out</target> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>DEBUG</level> 
      <onMatch>ACCEPT</onMatch> 
     </filter> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>INFO</level> 
      <onMatch>ACCEPT</onMatch> 
     </filter> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>TRACE</level> 
      <onMatch>ACCEPT</onMatch> 
     </filter> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>WARN</level> 
      <onMatch>DENY</onMatch> 
     </filter> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>ERROR</level> 
      <onMatch>DENY</onMatch> 
     </filter> 
     <encoder> 
      <pattern>%date %level [%thread] %logger %msg%n</pattern> 
     </encoder> 
    </appender> 

    <root level="INFO"> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="STDERR" /> 
    </root> 
</configuration> 
+3

有點冗長,但我喜歡這個解決方案,因爲它非常簡單易讀。 – Gondy 2015-09-09 14:30:29

0
<configuration scan="true" scanPeriod="60 seconds"> 
<appender name="A1" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${storm.log.dir}/${logfile.name}</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
     <fileNamePattern>${storm.log.dir}/${logfile.name}.%i</fileNamePattern> 
     <minIndex>1</minIndex> 
     <maxIndex>9</maxIndex> 
    </rollingPolicy> 

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     <maxFileSize>100MB</maxFileSize> 
    </triggeringPolicy> 

    <encoder> 
     <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n</pattern> 
    </encoder> 
</appender> 

<appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${storm.log.dir}/access.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
     <fileNamePattern>${storm.log.dir}/access.log.%i</fileNamePattern> 
     <minIndex>1</minIndex> 
     <maxIndex>9</maxIndex> 
    </rollingPolicy> 

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     <maxFileSize>100MB</maxFileSize> 
    </triggeringPolicy> 

    <encoder> 
     <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ} %c{1} [%p] %m%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="METRICS" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${storm.log.dir}/metrics.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
     <fileNamePattern>${storm.log.dir}/logs/metrics.log.%i</fileNamePattern> 
     <minIndex>1</minIndex> 
     <maxIndex>9</maxIndex> 
    </rollingPolicy> 

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     <maxFileSize>2MB</maxFileSize> 
    </triggeringPolicy> 

    <encoder> 
     <pattern>%d %-8r %m%n</pattern> 
    </encoder> 
    </appender> 

    <root level="INFO"> 
    <appender-ref ref="A1"/> 
    </root> 

    <logger name="backtype.storm.security.auth.authorizer" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="ACCESS" /> 
    </logger> 

    <logger name="backtype.storm.metric.LoggingMetricsConsumer" additivity="false" > 
    <level value="INFO"/> 
    <appender-ref ref="METRICS"/> 
    </logger> 

</configuration> 

So here is the logback file in which I am not printing backtype.storm.metric.LoggingMetricsConsumer info level if i say additivity = "true" then for for all classes in backtype.* this rule will be applied 
10

最簡單的解決方法是在附加目的地使用ThresholdFilter

<appender name="..." class="..."> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>INFO</level> 
     </filter> 

完整的示例:

<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>INFO</level> 
     </filter> 
     <encoder> 
      <pattern>%d %-5level: %msg%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender"> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>ERROR</level> 
     </filter> 
     <target>System.err</target> 
     <encoder> 
      <pattern>%d %-5level: %msg%n</pattern> 
     </encoder> 
    </appender> 

    <root> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="STDERR" /> 
    </root> 
</configuration> 

更新:由於邁克在評論中指出,信息與ERROR級別在這裏打印到STDOUT和STDERR。不知道OP的意圖是什麼。如果這不是你想要的,你可以嘗試Mike的答案。

+0

我正在使用記錄器和根。記錄器中的appender被執行,但是根中的appender沒有被調用。 – 2016-08-25 06:55:33

+0

Gangadhar,在你的孩子記錄器中設置additivity =「true」(你忽略了默認值)。 – 2016-08-26 19:56:35

+1

謝謝......重要的是不要忘記STDERR appender中的標籤!但是這也有一個問題:所有輸出在過濾器級別以上的輸出被打印......但是stdout你想要打印錯誤級別(和以上)......看到我的解決方案,它將這與SHébert的答案結合起來... – 2016-11-09 19:20:12

2

我對這個答案沒有任何評價,因爲它僅僅是上面最好的兩個答案的組合:X. Wo Satuk和SébastienHelbert:ThresholdFilter是可愛的,但你不能配置它有一個上級別以及較低級別*,但將它與兩個設置爲「DENY」WARNERRORLevelFilters結合起來就是一種享受。

非常重要:不要忘了STDERR appender中的<target>System.err</target>標籤:我的遺漏讓我感到沮喪了幾分鐘。

<configuration> 
    <timestamp key="byDay" datePattern="yyyyMMdd'T'HHmmss" /> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>INFO</level> 
     </filter> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>WARN</level> 
      <onMatch>DENY</onMatch> 
     </filter> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>ERROR</level> 
      <onMatch>DENY</onMatch> 
     </filter> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) 
       - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender"> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>WARN</level> 
     </filter> 
     <target>System.err</target> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) 
       - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <root level="debug"> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="STDERR" /> 
    </root> 
</configuration> 

*但它確實有在API的方法decide,但我還沒有線索怎麼你會在這種情況下使用它。

+0

這確實是結合ThresholdFilter和LevelFilter的最佳解決方案! – geistLich 2018-03-04 12:09:12

0

的如何輸出電平「INFO」或更高的彩色的消息控制檯和水平的消息「WARN」或更高,以文件實施例。

logback.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 

<configuration> 
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>INFO</level> 

      <!--output messages of exact level only--> 
      <!--<onMatch>ACCEPT</onMatch>--> 
      <!--<onMismatch>DENY</onMismatch>--> 
     </filter> 
     <encoder> 
      <pattern>%d{yyyy-MMM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n 
      </pattern> 
     </encoder> 
    </appender> 

    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>myfile.log</file> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>WARN</level> 
     </filter> 
     <append>true</append> 
     <encoder> 
      <pattern>%d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <root level="INFO"> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="FILE"/> 
    </root> 
</configuration> 
2

試試這個。您可以使用內置的ThresholdFilterLevelFilter。無需編程創建您自己的過濾器。在這個例子中WARN和ERROR級別記錄到System.err的休息到System.out:

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- deny ERROR level --> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>ERROR</level> 
     <onMatch>DENY</onMatch> 
    </filter> 
    <!-- deny WARN level --> 
    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>WARN</level> 
     <onMatch>DENY</onMatch> 
    </filter> 
    <target>System.out</target> 
    <immediateFlush>true</immediateFlush> 
    <encoder> 
     <charset>utf-8</charset> 
     <pattern>${msg_pattern}</pattern> 
    </encoder> 
</appender> 

<appender name="stderr" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- deny all events with a level below WARN, that is INFO, DEBUG and TRACE --> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>WARN</level> 
    </filter> 
    <target>System.err</target> 
    <immediateFlush>true</immediateFlush> 
    <encoder> 
     <charset>utf-8</charset> 
     <pattern>${msg_pattern}</pattern> 
    </encoder> 
</appender> 

<root level="WARN"> 
    <appender-ref ref="stderr"/> 
</root> 

<root level="TRACE"> 
    <appender-ref ref="stdout"/> 
</root> 

0

無需編程。配置使您的生活變得輕鬆。

下面是它記錄不同級別的日誌到不同的文件

<property name="DEV_HOME" value="./logs" /> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>INFO</level> 
    </filter> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 
     <Pattern> 
      %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n 
     </Pattern> 
    </layout> 
</appender> 

<appender name="FILE-ERROR" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${DEV_HOME}/app-error.log</file> 
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
     <Pattern> 
      %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n 
     </Pattern> 
    </encoder> 

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- rollover daily --> 
     <fileNamePattern>${DEV_HOME}/archived/app-error.%d{yyyy-MM-dd}.%i.log 
     </fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>10MB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
    </rollingPolicy> 

    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>ERROR</level> 
     <!--output messages of exact level only --> 
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>DENY</onMismatch> 
    </filter> 
</appender> 
<appender name="FILE-INFO" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${DEV_HOME}/app-info.log</file> 
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
     <Pattern> 
      %d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n 
     </Pattern> 
    </encoder> 

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- rollover daily --> 
     <fileNamePattern>${DEV_HOME}/archived/app-info.%d{yyyy-MM-dd}.%i.log 
     </fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>10MB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
    </rollingPolicy> 


    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>INFO</level> 
     <!--output messages of exact level only --> 
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>DENY</onMismatch> 
    </filter> 
</appender> 


<appender name="FILE-DEBUG" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${DEV_HOME}/app-debug.log</file> 
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
     <Pattern> 
      %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n 
     </Pattern> 
    </encoder> 

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- rollover daily --> 
     <fileNamePattern>${DEV_HOME}/archived/app-debug.%d{yyyy-MM-dd}.%i.log 
     </fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>10MB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
    </rollingPolicy> 

    <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
     <level>DEBUG</level> 
     <!--output messages of exact level only --> 
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>DENY</onMismatch> 
    </filter> 
</appender> 

<appender name="FILE-ALL" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${DEV_HOME}/app.log</file> 
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
     <Pattern> 
      %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n 
     </Pattern> 
    </encoder> 

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- rollover daily --> 
     <fileNamePattern>${DEV_HOME}/archived/app.%d{yyyy-MM-dd}.%i.log 
     </fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>10MB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
    </rollingPolicy> 
</appender> 

<logger name="com.abc.xyz" level="DEBUG" additivity="true"> 
    <appender-ref ref="FILE-DEBUG" /> 
    <appender-ref ref="FILE-INFO" /> 
    <appender-ref ref="FILE-ERROR" /> 
    <appender-ref ref="FILE-ALL" /> 
</logger> 

<root level="INFO"> 
    <appender-ref ref="STDOUT" /> 
</root> 

在突擊測驗我想說
相關問題