J'utilise log4j pour enregistrer les erreurs et autres informations système. mais venez des informations enregistrées deux fois au niveau INFO.
public static void main(final String... args) throws Exception {
LOGGER.info("program started");
try {
// try body codes
} catch (Exception ex) {
LOGGER.info("program start-up failed.",ex);
}
}
cependant, lorsque le programme démarre ou échoue les informations consignées deux fois, tout le monde peut m'aider à trouver la cause de ce problème.
Il semble que vos messages soient consignés une fois par le consignateur racine et par le consignateur spécifique, car les deux appenders peuvent être configurés (ils peuvent se trouver à des emplacements différents, dans un fichier de propriétés, puis dans le code).
Pour résoudre ce problème, définissez additivity sur false sur votre enregistreur. Log4j manual mentionne l’additivité dans la section Annexes et Mise en page.
D'accord avec atlantis.
log4j.rootCategory=INFO, console
log4j.logger.org.hibernate=INFO
Les paramètres de propriété ci-dessus entraîneront une double journalisation.
Cependant, en ajoutant
log4j.additivity.org.hibernate=false
résolu le problème.
Consultez la page 62 de ce livre. http://books.google.com/books?id=hZBimlxiyAcC&printsec=frontcover#v=onepage&q&f=false
Pour ceux qui utilisent le format XML:
<logger name="package.class" additivity="false">
<level value="info" />
<appender-ref ref="file" />
<appender-ref ref="console" />
</logger>
Remarque: Par défaut, l'indicateur d'additivité des enregistreurs est défini sur true.
Ajoutez simplement
logger.setadditivity(false);
à votre code ( Référence ).
Nous avons des résultats doubles dans la console, car les appenders ne sont pas des singletons, ils sont additifs. Signification, une catégorie hérite de tous les appenders de ses ancêtres (par défaut). Si nous ajoutons un appender à une catégorie et que celui-ci écrit dans le même flux sous-jacent (console, même fichier, etc.) qu'un autre appender, le même message de journal apparaîtra deux fois (ou plus) dans le journal. De plus, si deux catégories d'une hiérarchie sont configurées pour utiliser le même nom d'appender, Log4j écrira deux fois dans cet appender. Configuré pour cette catégorie
Si vous pouvez exécuter le programme avec un débogueur Java, placez un point d'arrêt dans le programme où l'un de ces appels de double journalisation a lieu.
Examinez l'objet de journalisation dans le débogueur. S'il s'agit d'un org.Apache.log4j.Logger (v 1.2.x), il peut avoir un AppenderAttachableImpl. Vous pouvez interroger AppenderAttachableImpl pour la liste d'appender.
Si vous trouvez plus d'un éditeur, cela peut être le problème et un indice pour le résoudre.
J'ai eu le même problème et résolu en supprimant tous les ajouts de l'enregistreur racine . Je ne sais pas pourquoi, mais résolvez mon problème et je partage:
// Root
rootLogger = Logger.getRootLogger();
rootLogger.removeAllAppenders(); // Solve my problem
// CSV
csvLogger = rootLogger.getLogger("csvLogger");
// Txt
txtLogger = rootLogger.getLogger("txtLogger");
Sans cette ligne supplémentaire, même en définissant l'additivité sur false, chaque fois que je me connecte avec mon csvLogger ou mon txtLogger, il se connecte deux fois.
Une alternative potentielle à l'ajustement de la propriété additivity
consiste à examiner vos enregistreurs du plus spécifique au plus générique. Dans l'exemple suivant, nous nous attendons à voir une double journalisation dans la console pour tous les événements de journal se produisant dans foo.bar.LoggingExampleClass. Il serait prudent de supprimer l’appendeur de console supplémentaire du consignateur foo.bar.LoggingExampleClass car il est déjà couvert par le consignateur racine.
<Logger name="foo.bar.LoggingExampleClass" level="DEBUG">
<AppenderRef ref="Console" /> <!-- THIS APPENDER COULD BE REMOVED -->
<AppenderRef ref="FooBarPackageLogging" />
</Logger>
<Root level="WARN">
<AppenderRef ref="Console" />
<AppenderRef ref="MainLogFile" />
</Root>
Il existe des compromis entre l’approche d’ajustement de l’additivité et l’ajustement de l’appendeur. La désactivation de l'additivité pourrait empêcher par inadvertance l'utilisation de l'appendeur d'un enregistreur de niveau générique souhaitable. Dans l'exemple ci-dessus, la définition de la propriété additivity="false"
sur le consignateur foo.bar.LoggingExampleClass signifierait que l'événement de journalisation ne serait pas ajouté au fichier MainLogFile référencé dans le consignateur racine.
Par ailleurs, s’appuyer sur les parents appenders peut être problématique si les parents appenders sont modifiés sans examiner les effets sur des enregistreurs plus granulaires. Par exemple, supposons qu'il soit obligatoire que les événements de journalisation foo.bar.LoggingExampleClass soient écrits sur la console. Ils se trouvent actuellement dans l'exemple de configuration ci-dessus en raison de l'additivité, même si l'appendeur de la console foo.bar.LoggingExampleClass Logger est supprimé. Toutefois, si l'appendice de console était également supprimé du journal racine sans ajustements supplémentaires, les exigences ne seraient plus satisfaites.
Dans votre fichier resources/log4.properties
.
Dans ce fichier de configuration, si vous avez "log4j.rootLogger= DEBUG, file
", n'incluez pas "log4j.logger.org.springframework=DEBUG, file
". Il suffit de garder la partie log4j.rootLogger.