2011-04-13 85 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> 

在突击测验我想说
相关问题