web-dev-qa-db-fra.com

Utilisation de log4net pour écrire dans différents enregistreurs

J'utilise log4net pour faire ma journalisation. Je voudrais qu'il écrive dans un fichier et dans le journal des événements en même temps.

Pour une raison quelconque, je trouve les messages deux fois dans mon fichier journal.

Voici ma section app.config:

<log4net>
    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="EventLogAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
        <param name="File" value="c:\temp\DIS-logfile.txt" />
        <param name="AppendToFile" value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%date %-5level %logger - %message%newline" />
        </layout>
    </appender>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
        <param name="Indigo.DataIntakeService" value="eventlog" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date %-5level %logger - %message%newline" />
            </layout>
    </appender>
</log4net>

Dans mon code, j'ai tof suivant:

private static readonly ILog Log = log4net.LogManager.GetLogger("DataIntakeService");
private static readonly ILog LogEvents = log4net.LogManager.GetLogger("EventLogAppender");

static void Main(string[] args)
{
    log4net.Config.XmlConfigurator.Configure();
}

public static void LogInfo(string message)
{
    Log.Info(message);
    LogEvents.Info(message);
}

Il écrit dans mon fichier journal, comme demandé, mais les messages doivent également être envoyés à mon visualiseur d'événements et cela ne se produit pas. Il écrit également ces messages dans le fichier journal.

Où est-ce que je me suis trompé?

18
Bart Schelkens

Vous avez configuré Log4Net de sorte que l'enregistreur racine se connecte aux annexes du fichier et du journal des événements. Tous les enregistreurs héritent de cette configuration, donc vos enregistreurs "DataIntakeService" et "EventLogAppender" se connectent à ces ajouteurs.

Si vous ne voyez pas les messages de journal dans l'Observateur d'événements, cela peut être dû au fait que votre application n'a pas l'autorisation de créer la source d'événements.

MISE À JOUR

Comment puis-je le configurer pour que DataIntakeService se connecte au fichier et l'autre au visualiseur d'événements?

Voici un exemple de configuration:

<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <logger name="EventLogAppender" additivity="False">
    <level value="INFO" />
    <appender-ref ref="EventLogAppender" />
  </logger>
  <appender>
  ... 

Avec cet échantillon:

  • L'enregistreur racine (et donc tous les enregistreurs enfants, sauf configuration contraire explicite) se connectera à LogFileAppender. Votre DataIntakeService logger n'est pas explicitement configuré, donc hérite de cette configuration.

  • L'enregistreur EventLogAppender est explicitement configuré pour se connecter à EventLogAppender et n'est pas configuré pour hériter des paramètres des enregistreurs parents (additivity="false"). Par conséquent, il ne se connecte pas à LogFileAppender. Si vous définissez additivity="true" il héritera des paramètres et se connectera à la fois LogFileAppender et EventLogAppender.

Soit dit en passant, nommer un enregistreur EventLogAppender est peut-être un peu déroutant: EventLogLogger pourrait être un meilleur nom.

30
Joe

Vous pouvez utiliser log4net pour écrire dans différents enregistreurs par la configuration ci-dessous.

<log4net>
<logger name="LogFileLogger">
  <level value="INFO" />
  <appender-ref ref="LogFileAppender" />
</logger>
<logger name="EventLogger">
  <level value="INFO" />
  <appender-ref ref="EventLogAppender" />
</logger>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
  ...
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
  ...
</appender>

Et vous pouvez appeler les enregistreurs comme:

private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger");
private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger");
11
serefbilge