当前位置: 首页 > 知识库问答 >
问题:

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

扈韬
2023-03-14

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

这是我的日志4J2。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>

但是,信息级消息以“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]

那么,是否有可能删除重复的项目?

非常感谢,圣诞快乐

共有3个答案

胥诚
2023-03-14

对自log4j 2.13以来,存在LevelPattern选择器。你可以这样使用它。

我使用错误/致命案例作为默认模式。您还可以将其指定为显式。

xml prettyprint-override">      <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>
孙朝明
2023-03-14

终于,我明白了

    <?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>

谢谢你的灵感。

诸葛柏
2023-03-14

Log4j2的最新版本允许使用模式选择器,而不仅仅是单个模式。Log4j提供了一个基于标记的选择器,而不是一个基于级别的选择器。创建一个Jira问题,我将添加它。但是,Log4j允许您使用脚本来选择模式。编写一个基于级别进行选择的脚本将非常简单。

在上面的配置中,debug appender还将输出信息级别的事件,这就是您看到重复事件的原因。

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

<?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>
 类似资料:
  • 本文向大家介绍Log4j按级别输出日志到不同文件的实现方法,包括了Log4j按级别输出日志到不同文件的实现方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上就是小编为大家带来的Log4j按级别输出日志到不同文件的实现方法全部内容了,希望大家多多支持呐喊教程~

  • 如何编写一个简单的log4j2.xml文件,将不同级别的日志放入不同的文件中? 例如,我们有错误日志,任何信息日志,我需要将所有错误日志消息推入一个日志文件,所有信息日志消息推入另一个文件。 我怎么做?

  • 问题内容: 合并输出和结果是否可能?我已经尝试将结果重定向到文件。我的主机是MacOS,运行ubuntu docker image。 问题答案: 你可以跑 是必需的,以便您的外壳程序不解释重定向

  • 以下是我的java logback配置: 我想在这里做的是:我有两个日志追加器:一个用于控制台,另一个用于日志文件;但是对于相同的java软件包(例如:组织.apache.zookeeper),我想使用两个不同的日志级别,INFO用于文件追加器和错误用于康多尔;但是我的日志配置优势无法正常工作。任何人都可以找出我的错误或一些解决方案吗?

  • 下面,我有一个全局应用的日志回溯配置。 我想全局使日志记录级别错误,除了一个类。对于一个特定的类,我想使日志记录级别 INFO。我该怎么做?

  • 我的简单问题是:如果我有两个类似logger的语句。info()和记录器。error()在Java中(使用log4j),我希望将这两行的结果打印在两个单独的文件中。也就是说,记录器。信息(…)应该打印到一个文件,比如myLog。信息和记录器。错误(…)应该打印到myLog。错误文件。我正在使用滚动文件追加器执行此任务。另外,我只需要一个记录器对象来完成任务。有人可能会建议两个或多个不同的记录器,每