web-dev-qa-db-fra.com

Log4Net - Comment ajouter un 2e enregistreur utilisé uniquement pour des sections spécifiques de code

J'utilise Log4Net 2.0, je le fais fonctionner comme requis mais auquel ajouter un autre enregistreur pour des instructions de journal spécifiques. Toute la journalisation est effectuée dans un seul fichier appender. Le changement que je veux faire est qu'une application tierce déclenche des événements contenant des informations de débogage/erreur, je peux attraper ces informations et bien qu'utile, je pense qu'elles polluent le fichier journal d'application normal, et préfèrent plutôt que cela soit stocké dans son propre journal fichier.

Le résultat final que je voudrais est un fichier appelé log-file.txt Avec toute la journalisation de l'application à l'exception de la journalisation tierce. Et un 2ème fichier appelé log-file-3rdparty.txt Avec journalisation uniquement depuis l'application tierce. Le problème que j'ai est de configurer Log4Net pour avoir 2 enregistreurs séparés. J'ai déjà essayé de créer un 2e LogFileAppender et de l'ajouter à la racine, mais tout cela fait mettre les mêmes instructions de journalisation dans les deux enregistreurs.

Dans l'application, nous avons actuellement l'instruction GetLogger comme suit. Idéalement, cela doit rester le même, donc la journalisation existante est inchangée. J'ai besoin d'un nouvel enregistreur qui n'est pas affecté par cette déclaration, mais est plutôt instancié uniquement pour la journalisation tierce.

private readonly ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Et l'App.Config comme suit.

< log4net>
<logger name="MyApp.Logging">
  <level value="DEBUG"/>
</logger>

<root>
  <level value="ALL" />
  <appender-ref ref="LogFileAppender" />
</root>

<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
  <param name="File" value="log-file.txt" />
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="Header" value="&#13;&#10;[Application started]&#13;&#10;" />
    <param name="Footer" value="[Application Finished]&#13;&#10;"/>
    <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
  </layout>
</appender>
</ log4net>

Pouvez-vous m'aider?

MODIFIER

Si cela fait une différence. Les événements de journal tiers sont capturés dans la même classe que certains de mes événements de journal d'application sont également déclenchés, car la classe est responsable du contrôle du logiciel tiers. Est-ce un problème? J'ai une idée que log4net peut différencier l'enregistreur à créer en fonction des noms de classe, et si c'est le cas, dois-je refactoriser la journalisation tierce dans sa propre classe?

39
JonWillis

Vous pouvez facilement créer un enregistreur spécial comme celui-ci:

ILog specialLogger = LogManager.GetLogger("SpecialLogger");

Vous pouvez ensuite configurer le système pour utiliser un appender dédié pour cet enregistreur:

<logger name="SpecialLogger" additivity="false">
   <level value="ALL" />
   <appender-ref ref="SpecialLogFileAppender" />
</logger>
<root>
   <level value="ALL" />
   <appender-ref ref="LogFileAppender" />
</root>
91
Stefan Egli