web-dev-qa-db-fra.com

Comment ajouter des appenders Log4J2 au moment de l'exécution par programmation?

Est-il possible d'ajouter par programmation des appender Log4J2 à l'aide des spécifications de la configuration XML?

Je prévois de tout définir dans le log4j2.xml, puis de choisir les ajouts de la situation de la même manière (sans compiler):

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

Edit: pour les dernières versions de log4j2, voir https://stackoverflow.com/a/33472893/1899566 à la place.

J'ai l'impression qu'ils ne veulent pas que vous fassiez cela, mais cela fonctionne pour moi:

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

Un certain nombre de demandes visant à prendre en charge une meilleure configuration par programme pour Log4j 2. Désolé, cela a pris si longtemps. Depuis Log4j 2.4, une API a été ajoutée à log4j-core pour faciliter la configuration par programme .

La nouvelle API ConfigurationBuilder permet aux utilisateurs de construire le composant définitions. Avec cette API, il n'est pas nécessaire de travailler directement avec des objets de configuration réels (tels que LoggerConfig et FileAppender) qui nécessitent de nombreuses connaissances sur le fonctionnement de Log4j sous le capot. Les définitions de composant sont ajoutées à ConfigurationBuilder et, une fois que toutes les définitions ont été collectées, tous les objets de configuration réels (tels que les enregistreurs et les appendices) sont construits. Cela ressemble un peu à la syntaxe de configuration XML, sauf que vous écrivez du code Java.

Notez que la nouvelle API ConfigurationBuilder permet au code utilisateur de créer une nouvelle configuration ou de remplacer complètement la configuration existante. Si votre cas d'utilisation est différent et que vous souhaitez modifier (et non remplacer) une configuration existante après le démarrage de Log4j par programme, vous devrez utiliser des objets de configuration réels. Dans ce cas, reportez-vous à la section Modification par programme de la configuration actuelle après l’initialisation du manuel.

23
Remko Popma

Comme je l'ai noté ci-dessus, je ne pouvais pas obtenir https://logging.Apache.org/log4j/2.x/manual/customconfig.html#AddingToCurrent au moins, pas comme je l'aurais prévu (mon appender ne recevrait jamais de messages qui y seraient acheminés). Je suis finalement tombé sur un modèle qui fonctionne pour moi - me permettant d’ajouter un appender au moment de l’exécution et de lui faire acheminer les messages de journal.

Edit J'ai enlevé un tas de code déroutant d'ici qui ne faisait rien ....

    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();

Un point important pour moi était que le fait d'appeler addAppender et de transmettre votre appender directement ne fonctionne pas, mais demander son nom par son nom semble aller de soi. Ce qui n'a pas de sens ... mais depuis que je travaille, et j'en ai marre de perdre du temps sur quelque chose qui devrait être si simple ...

2
user2163960

Je ne sais pas si c'est utile: Un Appender peut être ajouté à un enregistreur en appelant la méthode addLoggerAppender de la configuration actuelle. référence: http://logging.Apache.org/log4j/2.x/manual/architecture.html

1
Xiaoyuan

Dans la structure Log4j2

        ---"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 () -> Renverra les appendices dans "Config". Pour moi c'est un bogue

loggerConfig.getAppenderRefs () -> fonctionne bien !!

0