java - 使用 Log4j2 从静态方法记录

标签 java osgi log4j2

我正在尝试在 OSGi 环境中使用 Log4j2。到目前为止我已经让它工作了,但是在检查来自控制台和文件的日志时,我注意到其中一些丢失了,特别是从静态方法调用的日志。 下面示例中的 Log 类只是一个方便的类,让我的同事更轻松地调用日志记录功能(在示例中只是一个 String 当然看起来有点矫枉过正) 通过创建方法。它只是创建一个 Log 类的实例,该实例内部有一个 Logger,从 Log4j2 记录器调用相应的方法。

我的问题是:我的项目中是否只有一个简单的错误,或者 Log4j2 不能能够从静态方法记录到文件?

下面是一个代码示例,以使其更加清晰:

Log log = Log.testLog();
    log.info("non static log" );

这是我从非静态方法调用的代码。 这是 testLog() 方法:

public static Log testLog() {
    Log.create( Log.class ).info( "static log" );
    return Log.create( Log.class );
}

结果: #info() 调用都写入控制台 Appender,但只有“非静态日志”消息被写入文件。

这是我的log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>


<Appenders>
    <Console name="Console">
        <PatternLayout pattern="!ENTRY %logger{1.} %level %d{DEFAULT} [%t]%n!MESSAGE %msg%n%n"/>
    </Console>

    <RollingFile name="RollingFile" fileName="${sys:osgi.logfile}.log4j.log"
            filePattern="${sys:osgi.logfile}.log4j_bak_%i.log">
        <PatternLayout>
            <pattern>!ENTRY %logger{1.} %level %d{DEFAULT} [%t]\n!MESSAGE %msg%n%n</pattern>
        </PatternLayout>
        <Policies>
            <SizeBasedTriggeringPolicy size="1 MB"/>
        </Policies>
        <DefaultRolloverStrategy max="10"
            fileIndex="min"/>
    </RollingFile>
  </Appenders>

  <Loggers>
    <Root level="TRACE" additivity="false">
        <AppenderRef ref="RollingFile"/>
        <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

最佳答案

终于找到了我的特定问题的根源,即 OSGi(在本例中为 Equinox 框架)。我的应用程序使用 osgi.logfile 系统属性指向应保存日志的位置。

不幸的是,Equinox 不仅创建了该属性,而且还在启动时将其更改为不同的位置。对于 Log4j2,我使用 ${sys:osgi.logfile} 来获取这个系统属性,但是因为一些特定的插件启动得太早,Log4j2 仍然为这些插件配置了错误的(也就是旧的)位置(更具体地说:他们的 LoggerContext)。

在这种情况下对我有帮助的是 LoggerContext 上的一个简单的 LoggerContext.reconfigure(),它仍然具有旧位置。

关于java - 使用 Log4j2 从静态方法记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39510335/

相关文章:

java - 使用 Apache Camel Blueprint - 需要在容器内和独立状态下保留属性

java - 如何根据 java 系统属性有条件地添加 log4j2 appender?

java - Log4J 2 XML 配置未写入文件

java - 使用 Java 的 File.delete() 方法

java - 获取与系统格式相同的系统日期

java - Byte Buddy 和 OSGi Weaving Hook

java - OSGi 上的 PostgreSQL 连接器

wildfly - 如何让 Log4j2 在 Wildfly 8.2 中工作

java - Netty:在随机位置获取当前 'Channel'

java - Eclipse 中的 JBoss EAP 6.0 (Kepler) : How do you run a custom script at startup?