【问题标题】:Is it possible for using different pattern layout for different log level and output to SYSTEM_OUT?是否可以为不同的日志级别使用不同的模式布局并输出到 SYSTEM_OUT?
【发布时间】:2015-12-24 03:03:39
【问题描述】:

对于log4j2,是否可以为不同的日志级别使用不同的模式布局并输出到SYSTEM_OUT?

这是我的 log4j2.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <Appenders>
            <Console name="debugMsg" target="SYSTEM_OUT">
                <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %l - %msg%n"/>
            </Console>
            <Console name="infoMsg" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="trace"  additivity="false">
                <AppenderRef ref="infoMsg" level="info"/>
                <AppenderRef ref="debugMsg" level="debug"/>
            </Root>
        </Loggers>
    </Configuration>

但是,INFO 级别消息以“infoMsg”和“debugMsg”模式显示。

2015-12-24 10:51:56.176 Log4j is ready.
[INFO ] 2015-12-24 10:51:56.176 com.myftpserver.MyFtpServer.<init>(MyFtpServer.java:65) - Log4j is ready.
2015-12-24 10:51:56.176 Configuration file is loaded
[INFO ] 2015-12-24 10:51:56.176 com.myftpserver.Configuration.load(Configuration.java:74) - Configuration file is loaded
[DEBUG] 2015-12-24 10:51:56.176 com.myftpserver.Configuration.load(Configuration.java:82) - supportPassiveMode=true
2015-12-24 10:51:56.301 User Manager class is loaded.
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.Configuration.load(Configuration.java:119) - User Manager class is loaded.
2015-12-24 10:51:56.301 File Manager class is loaded.
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.Configuration.load(Configuration.java:121) - File Manager class is loaded.
2015-12-24 10:51:56.301 Server Initialization completed.
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.MyFtpServer.<init>(MyFtpServer.java:69) - Server Initialization completed.
2015-12-24 10:51:56.301 Available passive port:[1232, 1233, 1234]
[INFO ] 2015-12-24 10:51:56.301 com.myftpserver.MyFtpServer.<init>(MyFtpServer.java:75) - Available passive port:[1232, 1233, 1234]

那么,是否可以删除重复项?

非常感谢你,圣诞快乐

【问题讨论】:

    标签: java logging log4j2


    【解决方案1】:

    最新版本的 Log4j2 允许使用模式选择器,而不仅仅是单个模式。 Log4j 提供了一个基于标记的选择器,而不是一个基于级别的选择器。创建一个 Jira 问题,我将添加它。但是,Log4j 确实允许您使用脚本来选择模式。写一个根据关卡选择的会很简单。

    在上面的配置中,调试附加程序也将输出信息级别事件,这就是您看到重复项的原因。

    我还没有测试过,但我相信下面的配置应该可以满足您的需求:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout>
                    <ScriptPatternSelector defaultPattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %l - %msg%n">
                        <Script name="LevelSelector" language="bsh"><![CDATA[
                            if (logEvent.getLevel() == org.apache.logging.log4j.Level.INFO) {
                                return "INFO";
                            } 
                            return null;
                            ]]>
                        </Script>
                        <PatternMatch key="INFO" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
                    </ScriptPatternSelector>
                </PatternLayout>
            </Console> 
        </Appenders>
        <Loggers>
            <Root level="trace">
                <AppenderRef ref="Console"/>
            </Root>
        </Loggers>
    </Configuration>
    

    【讨论】:

      【解决方案2】:

      终于搞定了

          <?xml version="1.0" encoding="UTF-8"?>
          <Configuration>
              <Appenders>
                  <Console name="Console" target="SYSTEM_OUT">
                      <PatternLayout>
                          <ScriptPatternSelector defaultPattern="">
                              <Script name="LevelSelector" language="javascript"><![CDATA[
                                  result=null;
                                  switch (logEvent.getLevel())
                                  {
                                      case org.apache.logging.log4j.Level.DEBUG:
                                      case org.apache.logging.log4j.Level.INFO:result=logEvent.getLevel();
                                                                               break;
                                      default:result=null;                                            
                                  }
                                  result;
                                  ]]>
                              </Script>
                              <PatternMatch key="DEBUG" pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %l - %msg%n"/>
                              <PatternMatch key="INFO" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
                          </ScriptPatternSelector>
                      </PatternLayout>
                  </Console> 
              </Appenders>
              <Loggers>
                  <Root level="trace">
                      <AppenderRef ref="Console"/>
                  </Root>
              </Loggers>
          </Configuration>
      

      感谢您的启发。

      【讨论】:

        【解决方案3】:

        是的。从 log4j 2.13 开始,就有了 LevelPatternSelector。你可以这样使用它。

        我使用错误/致命情况作为默认模式。您也可以明确指定它。

              <Console name="stdout" target="SYSTEM_OUT">
                 <PatternLayout>
                    <LevelPatternSelector defaultPattern="%highlight{[%p] %d{HH:mm:ss} %c:%L %m}{bright,red}%n">
                       <PatternMatch key="WARN" pattern="%highlight{[%p] %d{HH:mm:ss} %c:%L %m}{bright,yellow}%n" />
                       <PatternMatch key="INFO" pattern="[%style{%p}{blue}] %d{HH:mm:ss} %c:%L %m%n" />
                       <PatternMatch key="DEBUG" pattern="[%p] %d{HH:mm:ss} %c:%L %m%n" />
                       <PatternMatch key="TRACE" pattern="[%p] %d{HH:mm:ss} %c:%L %m%n" />
                    </LevelPatternSelector>
                 </PatternLayout>
              </Console>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-24
          • 1970-01-01
          • 1970-01-01
          • 2014-10-19
          • 2019-05-13
          • 1970-01-01
          • 2018-07-05
          相关资源
          最近更新 更多