Log4net'i birden çok dosyaya yazacak şekilde yapılandırın


130

Aynı işlemden 2 farklı günlük dosyasına günlük yazmak istiyorum.

bu log4net kullanarak yapılabilecek bir şey mi?

Her günlük dosyasına ayrı mesajlar yazmam gerekecek. belirli bir ekleyiciye nasıl mesaj yazabilirim?


3
Ayrı ekleyiciler için oturum açamazsınız - farklı kaydediciler yapılandırmanız ve her birine uygun ekleyiciyi eklemeniz gerekir. Daha sonra farklı kaydedicilere farklı mesajlar kaydedin.
Vinay Sajip

Yapılandırma olarak kod kullanarak bunu şu şekilde yaptım: stackoverflow.com/questions/27846157/…
Jay Sullivan

Yanıtlar:


82

Evet, kaydedicinize birden fazla FileAppenders ekleyin. Örneğin:

<log4net>
    <appender name="File1Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-1.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="File2Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-2.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="File1Appender" />
        <appender-ref ref="File2Appender" />
    </root>
</log4net>

5
Güzel .. :) ancak, her günlük dosyasına ayrı mesajlar yazmam gerekecek. belirli bir ekleyiciye nasıl mesaj yazabilirim? Teşekkürler. ofer
ofer

2
@ ofer- bunun nasıl yapılacağına dair cevabımı görün.
RichardOD

1
File1Appender'ın DEBUG hatalarını günlüğe kaydetmesini ve File2Appender'ın ERROR hatalarını günlüğe kaydetmesini istiyorsanız ne olur?
JsonStatham

Benzer şeyler elde etmeye çalışıyorum. Soruma cevap verirseniz sevinirim: stackoverflow.com/questions/24886364/…
Ashish Charan

202

Bu cevaplar yardımcı oldu, ancak cevabımı hem app.config kısmı hem de c # kodu kısmı ile paylaşmak istedim, böylece bir sonraki kişi için daha az tahmin yapılsın.

<log4net>
  <appender name="SomeName" type="log4net.Appender.RollingFileAppender">
    <file value="c:/Console.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
  </appender>
  <appender name="Summary" type="log4net.Appender.FileAppender">
    <file value="SummaryFile.log" />
    <appendToFile value="true" />
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="SomeName" />
  </root>
  <logger additivity="false" name="Summary">
    <level value="DEBUG"/>
    <appender-ref ref="Summary" />
  </logger>
</log4net>

Sonra kodda:

ILog Log = LogManager.GetLogger("SomeName");
ILog SummaryLog = LogManager.GetLogger("Summary");
Log.DebugFormat("Processing");
SummaryLog.DebugFormat("Processing2"));

Burada c: /Console.txt "İşleniyor" ... ve \ SummaryFile.log "Processing2" içerecektir.


58
Sadece, her şeyin köke kaydedilmesini engelleyen günlükçü üzerindeki additivity = "false" özelliğine dikkat çekmek istedim.
Jason Hernandez

1
Bu, log4net'in gücünün harika bir örneğidir. Teşekkürler!
ezmek

5
Yukarıdaki yapılandırma eksik <layout> ... </layout>, bu olmadan günlük dosyasında herhangi bir mesaj görmedim.
CrnaStena

@CrnaStena Yaptığınız tek değişikliğin bu olduğundan emin misiniz?
Gary

1
@Craig Bunu kullanmakla ilgili daha fazla bilgi için şu soruya bakın: stackoverflow.com/questions/1999382/…
Gary

60

Vinay haklı. Onun cevabındaki yorumunuza cevaben, bunu yapmanın bir yolu şu şekildedir:

<root>
    <level value="ALL" />
    <appender-ref ref="File1Appender" />
</root>
<logger name="SomeName">
    <level value="ALL" />
    <appender-ref ref="File1Appender2" />
</logger>

Geçmişte bunu böyle yaptım. Sonra diğer günlük için buna benzer bir şey:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName");

Ve normal kaydedicinizi aşağıdaki gibi alabilirsiniz:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Bunun nasıl çalıştığını anlamak için dokümantasyonun kaydediciler ve ekler bölümünü okuyun .


3
Bunu alabilir aynı benim uygulamalardan biri kurulumunu ve :( benim için doesnt iş
Román

1
Bu tartışma çok eski ... cevap verebilirsiniz ... Yaklaşımınızı denedim ama iki kaydedici aynı mesajları kaydediyor. Log.Info ("") ve otherLog.Info ("") 'da olduğu gibi, her iki günlük dosyasına aynı anda mesaj yazar.
SutharMonil

1
@daniel_aren Evet, yaptığım şey, ek bloğunu ayrı dosya yollarına sahip iki ekleyici oluşturmak için kullandım (tıpkı bunun üstündeki gibi) .... çok etkili bir şekilde adlara sahip iki ek bloğumuz var: fileappender1 ve fileappender2 ... .
SutharMonil

1
@SutharMonil, Gary'nin cevabında olduğu ve Jason Hernandez tarafından vurgulandığı gibi, logger düğümüne basitçe 'additivity = "false" ekleyin. Bu durumda, yine de tüm mesajları kök dizinine koyacak, ancak yalnızca otherLog.Info'dan ("") gelen iletiler File1Appender2'de görünecektir
Freedomn-m

Şimdiye kadar en doğru cevap.
Fabricio

41

Tüm mesajları kök kaydediciye kaydetmek ve hatalar içeren ayrı bir günlüğe sahip olmak istedim, işte bunun nasıl yapılacağı:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="allMessages.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
    </appender>

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
        <file value="errorsLog.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ErrorsFileAppender" />
    </root>
</log4net>

Filtre elemanının kullanımına dikkat edin.


0

Günlükleri iki veya daha fazla dosyada yapılandırmak için aşağıdaki XML yapılandırmasını kullanın,

<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">           
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
     <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log1.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
     <logger additivity="false" name="RollingLogFileAppender2">
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender2" />
    </logger>
  </log4net>

Yukarıdaki XML yapılandırması iki farklı dosyada oturum açar.

Programlı olarak belirli bir günlükçü örneğini almak için,

ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2");

Birden çok dosyada oturum açmak için log4net kök öğesinin içine iki veya daha fazla ekleyici öğe ekleyebilirsiniz.

Yukarıdaki XML yapılandırma yapısı veya uygulamanız için hangi ekleyicinin en iyi olduğu hakkında daha fazla bilgi, Aşağıdaki bağlantıdan ayrıntıları okuyun,

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html

Umarım bu yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.