当前位置: 首页 > 面试题库 >

Log4J 2查找值在加载/存在之前已在配置中使用

施茂
2023-03-14
问题内容

我正在使用SystemPropertiesLookup查找来配置Log4J2配置。在我的main方法中,系统属性设置为第一行。问题在于,当Log4J加载配置时,尚未调用main方法,因此系统属性尚未填写。

这是我的log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" packages="org.base">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%highlight{%d [%c{1}] %-5level: %msg%n}{STYLE=Logback}"/>
        </Console>

        <File name="AppLog" fileName="logs/app-${sys:MIGRATION_ENV:-UNKNOWN}-${sys:MIGRATION_TITLE:-UNKNOWN}.log" append="false">
            <PatternLayout pattern="%d [%c{1}] %-5level: %msg%n"/>
        </File>
    </appenders>

    <loggers>
        <root level="error">
            <appender-ref ref="Console" level="error"/>
            <appender-ref ref="AppLog" level="error"/>
        </root>
        <logger name="org.base" level="debug" additivity="false">
            <appender-ref ref="Console" level="debug"/>
            <appender-ref ref="AppLog" level="debug"/>
        </logger>
    </loggers>
</configuration>

该文件将称为app-UNKNOWN-UNKNOWN,因为在Log4J填写文件时,该属性尚不可用。

有没有办法让Log4J等待,最好不要将配置转移到Java代码?

必须在运行时(主方法的第一行)设置属性。

可能的解决getLogger(..)方法是只调用该方法之后,而不用变量来对其进行初始化,但这实际上不适合我的任务。


问题答案:

您可以使用来做自己想做的事情RoutingAppender。这是一些示例代码:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;


public class SomeClass {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args){
        System.setProperty("myProperty", "myFile.log");

        if(log.isDebugEnabled())
            log.debug("This is some debug!");
        log.info("Here's some info!");
        log.error("Some erorr happened!");
    }
}

这是log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <Routing name="Routing">
            <Routes pattern="$${sys:myProperty}">
            <Route>
                <File name="File" fileName="logs/${sys:myProperty}"
                    immediateFlush="false" append="false">
                    <PatternLayout
                        pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
                </File>
            </Route>

            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" level="debug" />
            <AppenderRef ref="Routing" level="debug" />
        </Root>
    </Loggers>
</Configuration>

运行上面的Java代码,在当前工作目录内的日志文件夹中创建一个名为myFile.log的文件。日志文件的内容如下所示:

2018-05-21 22:13:29.147 [main] DEBUG example.SomeClass - This is some debug!
2018-05-21 22:13:29.160 [main] INFO  example.SomeClass - Here's some info!
2018-05-21 22:13:29.161 [main] ERROR example.SomeClass - Some erorr happened!


 类似资料:
  • 我正在使用SystemPropertiesLookup查找配置Log4J2配置。系统属性被设置为我的main方法中的第一行。问题是,当Log4J加载配置时,还没有调用main方法,因此还没有填充系统属性。 下面是我的log4j2.xml: 该文件将被称为app-UNKNOWN-UNKNOWN,因为当Log4J填充它时,属性还不可用。 一个可能的解决方法是在该方法之后只调用,而不是用变量初始化它,但

  • 现在我花了几天时间在java logger:log4j2上。如果您决定使用一个java logger,那么这种方法相对容易。xml文件。但是,如果您想通过代码创建配置,并通过java进行调整,那么这就有点复杂了。 下面的代码我现在可以管理。我没有成功地重新配置日志级别 每次深度在错误级别停止 您能否帮助指定如何重新加载已编程的log4j2配置? 谢谢

  • 我有几个微服务,它们都在尤里卡(发现客户端)注册。最近,我为所有微服务启用了Swagger2(SpringFox)。 一旦我启用了swagger,我的微服务就开始向Eureka注册为“Uknown”服务,并使用默认的8080端口注册。 我的应用程序类是这样的。 我已尝试从应用程序中移动我的Eureka配置。yml到引导。yml。但是,如果我移动功能区,我的客户端将无法获取应用程序实例和Eureka

  • 问题内容: 我已经成功编译了php和apache,没有为php配置文件指定目录。我想添加梨功能,但似乎没有php.ini的任何地方。 在我的phpinfo中,它说 配置文件(php.ini)路径/ usr / local / apache2 / php / lib 加载的配置文件(无) 扫描此目录以查找其他.ini文件(无) 已解析的其他.ini文件(无) 我去了/ usr / local / a

  • 你能帮我找出配置中缺少的步骤吗? 我正试图将logger添加到我非常简单的web应用程序中:为了做到这一点,我使用了log4j2 (beta9)。 我写下了我的<code>log4j2.xml<code>如下 我把它放在WEB-INF文件夹里。 然后,我有一个简单的servlet,它执行以下操作 正如你所看到的,这只是一个尝试,看看是否如预期的那样工作,但它没有。通过阅读此处的web app,我不

  • 我已经成功编译了php和apache,没有指定php配置文件的目录。我想添加pear特性,但似乎没有php。任何地方都可以<在我的phpinfo中,它说 配置文件(php.ini)路径 /usr/local/apache2/php/lib 加载配置文件(无) 扫描此目录以查找其他. ini文件(无) 解析的其他. ini文件(无) 我转到/usr/local/apache2/php/lib目录,那