首页 > 解决方案 > 具有不同日志级别的不同 java 进程的相同 log4j2.xml

问题描述

问题

我想为log4j2.xml我在不同 linux 服务器上运行的几个 Java 进程标准化我的设置。我的硬条件:log4j2.xml所有服务器都只有一个。

有时需要在 Java 进程运行时将我的loglevelfrom更改为INFOto 。您可以通过在配置中DEBUG更改 , 来做到这一点。logLevellog4j2.xmlmonitorInterval

但是,这会更改该loglevel服务器上运行的所有进程!我需要一个可以更改单个进程的 logLevel 的解决方案。

我的第一次尝试

我以为我会将 logLevel 移动到属性中。假设我有log4j2.xml(例如):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %t %-5p %-32c{1} - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${bundle:logger:logLevel}">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

在此旁边,我logger.properties在类路径中也有该文件:

logLevel=INFO

现在,当我更改我的log4j2.xml(通过在某处添加空格)并更新此属性文件时,日志记录会更改。但是,如前所述,它改变了logLevel所有进程。

我想要的是

我希望能够有一个logger.properties看起来像这样的:

process1LogLevel=INFO
process2LogLevel=DEBUG

然后在log4j2.xml动态配置这个属性的东西:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %t %-5p %-32c{1} - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${bundle:logger:<something based on the process name>}">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

然而,这个“灵活”的属性并没有真正起作用。您对解决方案有任何想法吗?

笔记

如果你有一个不同的想法,看起来有点不同但实现了我的目标,那也很好!任何开箱即用的解决方案总是受到赞赏:)

标签: javaxmllog4j2

解决方案


找到了。您可以嵌套属性。-Dname=process1例如,如果您指定,您可以像这样使用它:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration monitorInterval="1">
    <Properties>
        <Property name="process1">DEBUG</Property>
        <Property name="process2">INFO</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %t %-5p %-32c{1} - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${${sys:name}}">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

推荐阅读