2013-06-14 7 views
16

Günlük kaydını yapmak için log4net kullanıyorum. Bir dosyaya ve olay günlüğüne aynı anda yazılmasını istiyorum.Farklı kaydedicilere yazmak için log4net'i kullanma

Herhangi bir nedenle, iletileri günlük dosyamda iki kez buluyorum. Aşağıdaki tof var Benim kod

<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> 

:

Bu

benim app.config-bölümdür

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); 
     } 

Bu istendiği gibi, benim log-dosyaya yazar, ancak iletiler gerektiği ayrıca olay görüntüleyicime git ve bu gerçekleşmez. Bu mesajları da günlük dosyasına yazar.

Nerede hata yaptım?

cevap

24

Log4Net'i, kök kaydedicinin hem dosya hem de olay günlüğü ekleyicilerine günlüğe kaydedecek şekilde yapılandırdınız. Tüm kaydediciler bu yapılandırmayı devralır, bu nedenle her iki kaydediciniz "DataIntakeService" ve "EventLogAppender" bu ekleyiciler için günlüğe kaydedilir.

Olay görüntüleyicide günlük iletileri görmüyorsanız, uygulamanızın Etkinlik kaynağını oluşturma izninin olmaması olabilir.

GÜNCELLEME

Nasıl dosyanın ve eventviewer diğer birine böylece DataIntakeService günlükleri yapılandırabilirsiniz? Bu örnek ile

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

:

  • kök kaydedicisi (ve açıkça yapılandırılmış sürece dolayısıyla tüm alt kaydedicileri) LogFileAppender için günlüğe kaydeder

Aşağıda örnek bir yapılandırma var. Sizin DataIntakeService logger açık bir şekilde yapılandırılmamış, bu nedenle bu yapılandırmayı devralır.

  • EventLogAppender logger

    açıkça EventLogAppender için oturum açmak için yapılandırılır ve ebeveyn kaydediciler (additivity="false") ayarları devralır için yapılandırılmamış. Bu nedenle LogFileAppender'a giriş yapmıyor. additivity="true"'u ayarlarsanız, ayarları devralır ve hem LogFileAppender hem de EventLogAppender'a giriş yapın.

  • arada, bir logger EventLogAppender adlandırma kafa karıştırıcı biraz belki de: EventLogLogger daha iyi bir isim olabilir.

    +1

    Nasıl dosya ve eventviewer diğer birine o kadar DataIntakeService günlükleri yapılandırabilirsiniz? –

    +1

    Bu iyi bir açıklamadır. Sadece açıklığa kavuşmak gerekirse, 'additivity' belirtilmemişse, varsayılan 'True' ise doğru mu? – Ben

    +1

    @Ben evet, true addivity varsayılan: https://logging.apache.org/log4net/release/sdk/log4net.Repository.Hierarchy.Logger.Additivity.html – Joe

    7

    Aşağıdaki yapılandırmaya göre farklı kaydedicilere yazmak için log4net'i kullanabilirsiniz.

    <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> 
    

    Ve olarak günlükçüleri arayabilirsiniz:

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