如何配置Logback以将记录器的不同级别记录到不同的目的地?

| 如何配置Logback以将记录器的不同级别记录到不同的目的地? 例如,给定以下Logback配置,Logback将记录
INFO
消息到
STDOUT
ERROR
消息到
STDERR
吗? (请注意,此示例是示例“ 4”的变体,如第3章:Logback配置中所示)。
<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>
    
已邀请:
更新:有关使用Groovy的基于所有配置的方法,请参见Dean Hiller的答案。 - 您可以使用Logback过滤器做一些有趣的事情。以下配置仅将警告和错误消息打印到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;
        }
    }

}
    
我相信这将是最简单的解决方案:
<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>
    
仅基于配置的解决方案,带有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>
    
好的,这是我最喜欢的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>
    
最简单的解决方案是在附加器上使用
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>
更新:正如Mike在评论中指出的那样,此处将错误级别为ERROR的消息同时打印到STDOUT和STDERR。不过,不知道OP的意图是什么。如果这不是您想要的,可以尝试Mike的答案。     
这是我使用的配置,效果很好,它基于XML + JaninoEventEvaluator(需要将Janino库添加到Classpath中)
<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>  
    
我使用logback.groovy来配置我的logback,但是您也可以使用xml config来做到这一点:
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更为简单,因为无需创建过滤器类。 我为我的英语道歉!     
尝试这个。您可以只使用内置的
ThresholdFilter
LevelFilter
。无需以编程方式创建自己的过滤器。在此示例中,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>
    
我对这个答案不屑一顾,因为它只是上面两个最佳答案的组合:X. Wo Satuk和SébastienHelbert:
ThresholdFilter
很可爱,但是您不能配置它有一个鞋面级别以及较低级别*,但将其与设置为“ DENY”,“ 22”和“ 2”的两个
LevelFilters
结合使用是一种享受。 非常重要:不要忘记STDERR附加程序中的
<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
,但是我不知道您在这种情况下如何使用它。     
无需编程。配置使您的生活变得轻松。 以下是将不同级别的日志记录到不同文件的配置
<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>
    
<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
    
如何将级别为“ 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>
    

要回复问题请先登录注册