Сообщения Log4J2 StatusLogger не регистрируются в ODL - PullRequest
2 голосов
/ 26 мая 2020

Я недавно обновил log4j2 в своем приложении. Он работает поверх контроллера открытого дневного света. Пакет pax-logging-log4j2 (версия 1.11.3) добавлен в пакеты запуска karaf. В Log4J2 я также включил асинхронное ведение журнала. Приведенный ниже аргумент виртуальной машины добавлен в сценарий запуска karaf для включения асинхронного ведения журнала.

-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] ПРЕДУПРЕЖДЕНИЕ: определены асинхронные регистраторы, но библиотека Disruptor недоступна. Возврат к синхронным регистраторам. Игнорированный 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)

Добавлен «pax-logging-log4j2-extra» в startup.properties, и проблемы с зависимостями решены.

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

, но он не выбирает настраиваемую 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>
...