Log4j2-模式布局取决于日志级别

Log4j2-模式布局取决于日志级别,log4j2,Log4j2,是否可以定义两种不同的PatternLayout,并依赖于它使用的第一个或第二个应用程序日志级别 例如: 如果我以错误级别(默认值)运行应用程序,它应该打印日志语句,如下所示: $java -jar myApp.jar param1=value1 Error Message 1 Error Message 2 $java -jar myApp.jar --debug param1=value1 DEBUG | 18.03.2016 11:04:43,412 1058 | Debug Mes

是否可以定义两种不同的PatternLayout,并依赖于它使用的第一个或第二个应用程序日志级别

例如:

如果我以错误级别(默认值)运行应用程序,它应该打印日志语句,如下所示:

$java -jar myApp.jar param1=value1

Error Message 1
Error Message 2
$java -jar myApp.jar --debug param1=value1

DEBUG | 18.03.2016 11:04:43,412 1058 | Debug Message 1
DEBUG | 18.03.2016 11:04:43,412 1058 | Debug Message 2
INFO  | 18.03.2016 11:04:43,414 1060 | Info Message 1
ERROR | 18.03.2016 11:04:43,420 1066 | Error Message 1
ERROR | 18.03.2016 11:04:43,420 1066 | Error Message 2
但是,如果我使用INFO或DEBUG运行我的应用程序,它应该打印日志语句,如下所示:

$java -jar myApp.jar param1=value1

Error Message 1
Error Message 2
$java -jar myApp.jar --debug param1=value1

DEBUG | 18.03.2016 11:04:43,412 1058 | Debug Message 1
DEBUG | 18.03.2016 11:04:43,412 1058 | Debug Message 2
INFO  | 18.03.2016 11:04:43,414 1060 | Info Message 1
ERROR | 18.03.2016 11:04:43,420 1066 | Error Message 1
ERROR | 18.03.2016 11:04:43,420 1066 | Error Message 2
在内部,如果参数--debug或--info被给定,我的应用程序将切换全局日志级别。默认值为ERROR


我应该如何配置我的服务器来实现这一点??我找不到任何解决办法。以供参考,以及在运行时切换日志级别的位置。

查看PatternLayout文档末尾的模式选择器


在@RemkoPopma的提示下,我做了更多的研究并找到了解决方案。我的log4j2.xml现在看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout>
                <ScriptPatternSelector defaultPattern="%highlight{%-5p | %d{dd.MM.yyyy HH:mm:ss,SSS} %r | %m%n}">
                    <Script name="selector" language="javascript"><![CDATA[
                       substitutor.replace("${main:pacifyLogLevel}");
                    ]]>
                    </Script>
                    <!-- INFO and DEBUG are using the defaultPattern -->
                    <PatternMatch key="ERROR" pattern="%-5p %m%n" />
                </ScriptPatternSelector>
            </PatternLayout>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.geewhiz.pacify" level="error" />
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>
结果

substitutor.replace("${main:pacifyLogLevel}");
在PatternMatch中使用并查找。如果未找到,则使用defaultPattern。因此,在我的应用程序中,只有错误级别具有不同的日志模式。其他的则使用默认的日志模式


有更好的解决方案吗?

我很难理解您所说的“以错误级别运行我的应用程序”是什么意思。为此,它意味着您将记录器(根记录器?)设置为levelerror。若要将其设置为调试,您编辑了该文件以将级别重置为INFO或debug,此时您还可以编辑该模式。但是,假设您使用一个系统属性来包含级别值。如果这样做,可以使用模式选择器并基于系统属性选择模式。如果您试图以其他方式执行此操作,请让我们知道。请更新问题,以包括应产生您提到的结果的程序代码。我更新了我的问题,希望它现在更好。我希望看到您的Java程序是什么样子。@Remkopma我添加了它?看看这些链接。