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é?
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.
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");