2014-04-11 27 views
9

Her şeyden önce, diğer konularda birçok cevap ve ipucu gördüm (en benzer: Log4Net: Multiple loggers), ancak geçerli bir yanıt yoktur.Log4Net Çoklu kaydediciler

Farklı dosya ekleyicileriyle 2 günlüğüne sahip olmak ve her birini kök günlüğüne yazmak için kısıtlamak istiyorum. Bu konsol uygulaması. Tüm aşağıda kodu:

using System; 
using System.Diagnostics; 
using System.Linq; 
using log4net; 

namespace Test_log4net 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     ILog logger = LogManager.GetLogger("Async"); 
     logger.Info("started async"); 
     Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 


     ILog logger2 = LogManager.GetLogger("Sync"); 
     logger2.Info("started sync"); //changed: from logger -> to logger2 on 10/21/2014 
     Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 

     Console.ReadKey(); 
    }  
} 
} 

Ve App.config dosyası:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
</configSections> 
<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
</startup> 
<log4net> 
    <root> 
     <level value="All"/> 
    </root> 

    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\temp\\AsyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

    <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\temp\\SyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

    <logger Name="Sync" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderS"/> 
    </logger> 

    <logger Name="Async" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderA"/> 
    </logger> 

</log4net> 
</configuration> 

Ve konsol çıkışı:

Logger: Async 
Appenders: FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderA 

Dosyalar yaratılmıştır, ancak her ikisi de boş. ben gibi kök appenders, belirttiğinizde:

sonra
<root> 
    <level value="All"/> 
    <appender-ref ref="FileInfoAppenderA"/> 
    <appender-ref ref="FileInfoAppenderS"/> 
</root> 

, konsolu:

log4net:ERROR [RollingFileAppender] Attempted to append to closed appender named [FileInfoAppenderS] 
Logger: Async 
Appenders: FileInfoAppenderA, FileInfoAppenderS 
Logger: Sync 
Appenders: FileInfoAppenderA, FileInfoAppenderS 

Ve ancak AsyncTest.log içinde: Yanlış

2014-04-11 17:26:58,142 - started async 
2014-04-11 17:26:58,151 - started sync 

yapıyorum?

UPD (2014/10/21): Ben konsol çıkışı şu var Nuget yoluyla ulaşılabilir son log4net ile:

Logger: Async 
Appenders: FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderA 

Ve her iki dosyaları (AsyncTest.log, SyncTest.log) ait boş.

UPD (08/4/2015): Çözüm, log4net bölümündeki her şeyin niteliklerini ayarlarken küçük harf kullanmaktır. app.config Yani, ben sadece değişmiş olması gerekirdi aşağıdaki satırları: öznitelik 'name' küçük harflerle geçerli: fark

...... 
<logger name="Sync" additivity="false"> 
...... 
<logger name="Async" additivity="false"> 
...... 

Not.

+0

Sorunun sonuna kadar okumak gerekir. küçük harf sorunu. –

cevap

13

Örneğinizde birkaç yazım var. İlk yapılandırma etiketi kapatmayın olduğunu ve sadece bir dosya alıyoruz neden diyoruz çünkü geçerli:

logger.Info("started async"); 

ve bundan sonra şaşırtıcı yapın:

logger.Info("started sync"); 

Göreceksin ikinci dosyada yazmamak, çünkü aslında buna kayıt olmuyorsunuz.

Ve konsolda Kuralların olsun: Bu kaydediciler kök kaydedicisi devralan anlamına gelir çünkü gelecekteki bilgi için

Logger: Async 
Appenders: FileInfoAppenderS, FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderS, FileInfoAppenderA 

, sen false toplanırlığını koyarak doğru yaptı.ifadesi hakkında şöyle:

ben bunu anlamıyorum

ben kök kaydedicisi içine yazmak için her farklı dosya appenders ile 2 kaydediciler ve sınırlamak istiyor. Örneğin, kök kaydedici bir konsol ekleyicisine sahipken, kaydedicilerinizin bu dosyalara yazılmasını istiyorsanız, yalnızca eklentiyi kaldırın ve konsola ve kendi dosyalarına yazacaktır. Ayrıca test edilmiş ve çok iyi çalışıyor.

Yorumunuzu okudum. Şimdi ben kullanıyorum ve neye ihtiyacınız alıyorum kodu ekleyin:

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

     ILog logger = LogManager.GetLogger("Async"); 
     logger.Info("started async"); 
     Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 


     ILog logger2 = LogManager.GetLogger("Sync"); 
     logger2.Info("started sync"); 
     Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 

     Console.ReadKey(); 
    } 
} 

Ve app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <log4net> 
    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\\temp\\AsyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="DEBUG"/> 
     <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

     <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\\temp\\SyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
     </appender> 

    <root> 
     <level value="INFO"/> 
    </root> 

    <logger name="Sync" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderS"/> 
    </logger> 

    <logger name="Async" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderA"/> 
    </logger> 
    </log4net> 
</configuration> 

Log4Net sürümü: NET 4.0 ile 1.2.13.0 lütfen söyle bana eğer istediğini alırsan.

+0

XMight, tekrar gösterim için teşekkürler. Typos uygulaması etkilemez, sadece yazım (zaten - sabit). Ben daha önce burada yazılan kodu ve log4net 1.2.13.0 ile projeyi yeniden oluşturdum - hiç çalışmaz - her ikisi de logger2.Info ("sync başlat");). Ayrıca, her iki kaydedicide de yalnızca "FileInfoAppenderA" listelenmiştir. Ve amacımı açıklığa kavuşturmak için: 1) logger1'e ihtiyacınız var -> asyng.log'a giriş yapın SADECE 2) logger2'ye ihtiyacınız var -> SADECE sync.log dosyasına giriş yapın. 3) Logger1 değil, logger2 root logger'a giriş yapmalıdır (burada kayıtlı olan her şey) – LaoR

+0

nihayet problemin ne olduğunu anladım. Gülüyorsun) ' 've sizinki' '? Evet, yalnızca büyük/küçük harfe duyarlı özellik adı 'name! = Name' idi. Bu yüzden kaydedicilerim doğru dosyalara giriş yapmadı ve ikisi de boştu. – LaoR

+0

Sorunu bulduğunuz için mutluyum;) – XMight

0

Bu konfigürasyon benim için çalıştı:

<log4net> 
<root name="EventLog"> 
<level value="ALL"/> 
<appender-ref ref="EventLogAppender"/> 
</root> 

<logger name="FileLogger" additivity="false"> 
<level value="ALL" /> 
<appender-ref ref="RollingFileAppender" /> 

...appenders 
</logger> 

İyi Şanslar! Çözüm için