it-swarm.com.de

Wie kann ich Log4J2-Appender zur Laufzeit programmgesteuert hinzufügen?

Ist es möglich, Log4J2-Appender mithilfe der Spezifikationen aus der XML-Konfiguration programmgesteuert hinzuzufügen?

Ich habe vor, alles in der log4j2.xml zu definieren und dann in situ situativ Appender auszuwählen (wird nicht kompiliert):

if (arg[0].equals("log") ) {
    Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig");
} else {
    //...
}
28
Brian Johnson

Edit: Für die neuesten Versionen von log4j2 siehe stattdessen https://stackoverflow.com/a/33472893/1899566 .

Ich habe den Eindruck, dass Sie nicht wollen, dass Sie das tun, aber das funktioniert für mich:

if (arg[0].equals("log") ) {
  org.Apache.logging.log4j.Logger logger
    = org.Apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig");
  org.Apache.logging.log4j.core.Logger coreLogger
    = (org.Apache.logging.log4j.core.Logger)logger;
  org.Apache.logging.log4j.core.LoggerContext context
    = (org.Apache.logging.log4j.core.LoggerContext)coreLogger.getContext();
  org.Apache.logging.log4j.core.config.BaseConfiguration configuration
    = (org.Apache.logging.log4j.core.config.BaseConfiguration)context.getConfiguration();

  coreLogger.addAppender(configuration.getAppender("appenderNameFromXMLConfig"));
} else {
  //...
}
17
Robert Fleming

Es gab eine Reihe von Anfragen, um eine bessere programmatische Konfiguration für Log4j 2 zu unterstützen. Es hat leider so lange gedauert. Ab Log4j 2.4 wurde dem log4j-core eine API hinzugefügt, um die programmatische Konfiguration zu erleichtern.

Mit der neuen ConfigurationBuilder-API können Benutzer die Komponente definitions erstellen. Mit dieser API ist es nicht erforderlich, direkt mit tatsächlichen Konfigurationsobjekten (wie LoggerConfig und FileAppender) zu arbeiten, für die viel Wissen darüber erforderlich ist, wie Log4j unter der Haube arbeitet. Komponentendefinitionen werden dem ConfigurationBuilder hinzugefügt, und nachdem alle Definitionen gesammelt wurden, werden alle eigentlichen Konfigurationsobjekte (wie Logger und Appenders) erstellt. Es fühlt sich ein bisschen wie die XML-Konfigurationssyntax an, außer dass Sie Java-Code schreiben.

Beachten Sie, dass mit der neuen ConfigurationBuilder-API der Benutzercode eine neue Konfiguration erstellen oder die vorhandene Konfiguration vollständig ersetzen kann. Wenn Ihr Anwendungsfall anders ist und Sie eine vorhandene Konfiguration nach dem Start von Log4j programmgesteuert ändern (anstatt sie zu ersetzen), müssen Sie mit den eigentlichen Konfigurationsobjekten arbeiten. In diesem Fall lesen Sie bitte den Abschnitt Programmgesteuerte Änderung der aktuellen Konfiguration nach der Initialisierung des Handbuchs.

23
Remko Popma

Wie ich oben bereits festgestellt habe, konnte ich https://logging.Apache.org/log4j/2.x/manual/customconfig.html#AddingToCurrent nicht dazu bringen, zumindest so zu arbeiten, wie ich es erwartet hatte (Mein Appender würde niemals Nachrichten an ihn weiterleiten lassen). Ich stolperte schließlich über ein Muster, das für mich funktioniert - und erlaubte mir, zur Laufzeit einen Appender hinzuzufügen. Dieser Appender erhält tatsächlich Protokollnachrichten.

Edit Ich habe hier einen Haufen verwirrenden Codes entfernt, der nichts tat ...

    LoggerContext lc = (LoggerContext) LogManager.getContext(false);
    FileAppender fa = FileAppender.newBuilder().withName("mylogger").withAppend(false).withFileName(new File(outputDirectory, "ConsoleOutput.txt").toString())
            .withLayout(PatternLayout.newBuilder().withPattern("%-5p %d  [%t] %C{2} (%F:%L) - %m%n").build())
            .setConfiguration(lc.getConfiguration()).build();
    fa.start();
    lc.getConfiguration().addAppender(fa);
    lc.getRootLogger().addAppender(lc.getConfiguration().getAppender(fa.getName()));
    lc.updateLoggers();

Ein zentraler Punkt für mich war, dass das Aufrufen von addAppender und das direkte Übergeben Ihres Appenders nicht funktionieren, aber es scheint so, als würde der Appender nach Namen gefragt. Das macht keinen Sinn ... aber seit der Arbeit, und ich bin es leid, Zeit für etwas zu verschwenden, das so einfach sein sollte ...

2
user2163960

Ich weiß nicht, ob es nützlich ist: Ein Appender kann zu einem Logger hinzugefügt werden, indem die addLoggerAppender-Methode der aktuellen Konfiguration aufgerufen wird. reference: http://logging.Apache.org/log4j/2.x/manual/architecture.html

1
Xiaoyuan

In Log4j2-Struktur

        ---"Config"---
                Appenders
                        Appender(0)
                            Console
                        Appender(1)
                            File
                    LoggerConfigs
                        -- LoggerConfig(0) 
                        -- LoggerConfig(1)
                        -- LoggerConfig(2)

        ----"LoggerConfig"----
                - AppenderRefs
                    -- AppenderRef(0)
                        -- Name Console
                        -- Level : DEBUG
                - Appenders
                    -- Appender(0)
                        -- Name Console
                        -- Level : DEBUG
                - Level -- ALL

loggerConfig.getAppenders () -> Gibt die Appenders in "Config" zurück. Für mich ist das ein Fehler

loggerConfig.getAppenderRefs () -> funktioniert gut !!