2

我最近在我的应用程序中升级了 log4j2。它运行在开放日光控制器之上。pax-logging-log4j2(版本 1.11.3)包被添加到 karaf 启动包中。使用 Log4J2,我也启用了异步日志记录。在 karaf 启动脚本中添加了以下 VM 参数以启用异步日志记录。

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
-DAsyncLogger.WaitStrategy=Sleep

应用程序日志记录按预期工作,但有时日志不按顺序排列(时间戳重叠)。为了解决这个问题,我尝试将 AsyncQueueFullPolicy 设置为 ENQUEUE 并将 RingBufferSize 设置为 4098*1024 但没有运气。

-Dlog4j2.AsyncQueueFullPolicy=Enqueue
-DAysncLogger.RingBufferSize=4194304

尝试启用 Log4J2 状态记录器(如下所示),但未记录日志。

status=debug is added the "org.ops4j.apache.pax.logging.cfg" file.

几个问题,log4j2 状态记录器未记录,应用程序日志不按顺序排列。

这里的任何帮助都会有很大帮助。

编辑: 对状态记录器的进一步分析显示异步日志记录恢复为同步,原因是“com.lmax.disruptor.EventFactory 找不到”。

org.ops4j.pax.logging.pax-logging-api [log4j2] 警告:定义了异步记录器,但中断库不可用。恢复为同步记录器。忽略 FQCN:org.apache.logging.log4j.spi.AbstractLogger

java.lang.ClassNotFoundException: com.lmax.disruptor.EventFactory cannot be found by org.ops4j.pax.logging.pax-logging-log4j2_1.11.3
        at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:439)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:352)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:344)
        at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.ops4j.pax.logging.log4j2.internal.PaxLoggingServiceImpl.updated(PaxLoggingServiceImpl.java:263)
        at org.ops4j.pax.logging.log4j2.internal.PaxLoggingServiceImpl$1ManagedPaxLoggingService.updated(PaxLoggingServiceImpl.java:581)
        at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updated(ManagedServiceTracker.java:189)
        at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updateService(ManagedServiceTracker.java:152)
        at org.apache.felix.cm.impl.helper.ManagedServiceTracker.provideConfiguration(ManagedServiceTracker.java:85)
        at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.provide(ConfigurationManager.java:1463)
        at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1419)
        at org.apache.felix.cm.impl.UpdateThread.run0(UpdateThread.java:141)
        at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:109)
        at java.lang.Thread.run(Thread.java:748)

在 startup.properties 中添加了“pax-logging-log4j2-extra”,依赖问题得到解决。

现在创建了 AsyncLoggerContext。

org.ops4j.pax.logging.pax-logging-api [log4j2] DEBUG : Starting LoggerContext[name=pax-logging, org.apache.logging.log4j.core.async.AsyncLoggerContext@1eb9a021] with configuration org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@3810215b... Ignored FQCN: org.apache.logging.log4j.spi.AbstractLogger

但它没有选择在 VM 参数中添加的自定义 AsyncQueueFullPolicy。

-Dlog4j2.AsyncQueueFullPolicy=a.b.c.d.BlockingQueueFullPolicy

日志:

org.ops4j.pax.logging.pax-logging-api [log4j2] DEBUG : Using DefaultAsyncQueueFullPolicy. Could not create custom AsyncQueueFullPolicy 'a.b.c.d.BlockingQueueFullPolicy': java.lang.ClassNotFoundException: com.fujitsu.fnc.sdnfw.async.BlockingQueueFullPolicy cannot be found by org.ops4j.pax.logging.pax-logging-api_1.11.3 Ignored FQCN: org.apache.logging.log4j.spi.AbstractLogger

使用以下自定义策略创建了一个片段包并将其安装在 karaf。

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.async.AsyncQueueFullPolicy;
import org.apache.logging.log4j.core.async.EventRoute;

public class BlockingQueueFullPolicy implements AsyncQueueFullPolicy {

    public BlockingQueueFullPolicy() {
        // Don't Delete. Default constructor is required
    }

    @Override
    public EventRoute getRoute(long backgroundThreadId, Level level) {
        return EventRoute.ENQUEUE;
    }

}

和 pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>a.b.c.d.fw-async-policy-api</Bundle-SymbolicName>
                    <Bundle-Name>Custom Async Queue Full Policy API</Bundle-Name>
                    <Bundle-Vendor>XYZ</Bundle-Vendor>
                    <Bundle-ActivationPolicy>eager</Bundle-ActivationPolicy>
                    <Embed-Transitive>
                        false
                    </Embed-Transitive>
                    <Export-Package>
                        a.b.c.d
                    </Export-Package>
                    <Fragment-Host>system.bundle; extension:=framework</Fragment-Host>
                    <Import-Package>*</Import-Package>
                </instructions>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j.slf4j.impl.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j.slf4j.impl.version}</version>
    </dependency>
</dependencies>
4

0 回答 0