J'ai créé un appender personnalisé et il n'est pas appelé lorsque j'exécute mon test. Voici à quoi ressemblent les propriétés:
name=config appenders=console, myCustomAppender appender.console.type=Console appender.console.name=STDOUT appender.console.layout.type=PatternLayout #appender.console.layout.pattern =%d{HH:mm:ss} [%t] %c{1} [%-5level] - %msg%n appender.console.layout.pattern=%d{dd-MM-yyyy HH:mm:ss} [%-5p] (%F:%L) - %m%n appender.myCustomAppender = com.myCompany.logging.log4j.WindowsEventLogAppender appender.myCustomAppender.name = WindowsEventLogAppender appender.myCustomAppender.type = WindowsEventLogAppender rootLogger.level=info rootLogger.appenderRefs=stdout, myCustomAppender rootLogger.appenderRef.stdout.ref=STDOUT
Mon appender s'appelle un WindowsEventLogAppender. Une idée de ce qui ne va pas avec mon fichier de propriétés? Je vois les messages de test de la console mais aucun des messages de mon appender. Pour le moment, je fais juste un System.out.println dans mon appender personnalisé pour vérifier qu'il est appelé.
BTW, j'ai trouvé beaucoup d'exemples XML pour les configurations log4j2 avec des appenders personnalisés mais aucun d'avoir utilisé un fichier de propriétés pour la configuration.
Merci, -Mike
3 Réponses :
Essayez d'ajouter la propriété packages.
Comme: packages = com.myCompany
Vous n'avez pas inclus les informations sur le package
essayez la configuration ci-dessous.
name=config appenders=console, myCustomAppender appender.console.type=Console appender.console.name=STDOUT appender.console.layout.type=PatternLayout #appender.console.layout.pattern =%d{HH:mm:ss} [%t] %c{1} [%-5level] - %msg%n appender.console.layout.pattern=%d{dd-MM-yyyy HH:mm:ss} [%-5p] (%F:%L) - %m%n appender.myCustomAppender = com.myCompany.logging.log4j.WindowsEventLogAppender appender.myCustomAppender.name = WindowsEventLogAppender appender.myCustomAppender.type = WindowsEventLogAppender rootLogger.level=info rootLogger.appenderRefs=stdout, myCustomAppender rootLogger.appenderRef.stdout.ref=STDOUT rootLogger.com.mycompany.example=INFO,STDOUT
Je suis peut-être assez en retard ici, mais je pense que ma réponse peut aider d'autres personnes à chercher des réponses. Veuillez accepter ceci comme réponse si cela est correct!
Si vous avez créé un appender personnalisé avec une annotation comme celle-ci:
# this packages attribute is important, please put comma seperated package(s) to the # plugin(s) you have created packages = com.package.to.your.plugin # Example: Declare and Define OOTB Console appender, which sends log events to stdout appender.console.name = stdout appender.console.type = Console # Declare and define the custom appender like this # Note that the "abc" in "appender.abc.type" can be anything # and the value for "appender.abc.type" should be the same as # "Name" attribute value given in custom appender plugin which is "MyCustomAppender" appender.abc.name=arbitrary_name appender.abc.type=MyCustomAppender rootLogger.appenderRef.stdout.ref = stdout rootLogger.appenderRef.abc.ref = arbitrary_name logger.loggeridentifier.name = com.test.SomeClass logger.loggeridentifier.appenderRef.stdout.ref = stdout logger.loggeridentifier.appenderRef.abc.ref = arbitrary_name # Also note that the value of appenderRef should be the same name given to your # appender in properties file, which in this case is "arbitrary_name" (as given above)
Le manuel log4j2 sur Configuring Appenders indique que:
"Un appender est configuré soit en utilisant le nom du plugin appender spécifique, soit avec un élément appender et l'attribut type contenant le nom du plugin appender"
Ce qui signifie que le type
pour appender doit être la valeur d'attribut Name
d'Appender Plugin.
Dans le cas ci-dessus, MyCustomAppender ( appender.identifierName.type = MyCustomAppender
)
Ainsi, la configuration du fichier de propriétés pour que cela fonctionne devrait être:
(Remarque: j'ai ajouté un appender stdout (console) juste pour afficher pertinence / similarité d'utilisation avec les appenders OOTB, et 2 exemple utilisation avec RootLogger et un enregistreur personnalisé)
@Plugin(name = "MyCustomAppender", category = "Core", elementType = "appender", printObject = true) public final class MyCustomAppenderImpl extends AbstractAppender { // other code for the plugin.... }
Eh bien, pourquoi ne choisissez-vous pas de charger le xml? C'est la méthode par défaut et recommandée. Et simple aussi. Je ne veux pas paraître condescendant, juste une opinion
Je l'ai fait fonctionner avec le format XML, mais nous avons beaucoup de composants qui utilisent des fichiers de configuration .properties. Je pensais que garder les .properties serait la meilleure voie à suivre car je n'aurais pas à convertir un tas de fichiers .properties en XML. De plus, il semblerait que cela devrait fonctionner correctement? Sinon, pourquoi fournir la méthode .properties.