2014-04-11 13 views
9

Prima di tutto, ho visto molte risposte e suggerimenti in altri argomenti (il più simile: Log4Net: Multiple loggers), ma non esiste una risposta applicabile.Log4Net Registratori multipli

Desidero avere 2 logger con diversi file di appendici e limitare ciascuno a scrivere nel logger root. È app Console. Tutta codice qui sotto:

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

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

E console di output:

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

file sono stati creati, ma entrambi sono vuoti. Quando specifico appenders in radice, come:

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

poi, console:

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

E solo in AsyncTest.log:

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

Quello che sto facendo male?

UPD (2014/10/21): Con l'ultima log4net disponibile tramite Nuget Ho seguente output della console:

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

Ed entrambi file (AsyncTest.log, SyncTest.log) sono vuote.

UPD (2015/08/04): soluzione consiste nell'utilizzare minuscolo durante l'impostazione degli attributi per tutto nella sezione log4net. righe seguenti Allora, ho appena avrebbe dovuto cambiare in app.config:

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

Nota la differenza: attributo 'name' è in minuscolo.

+0

per la soluzione ho bisogno di leggere fino alla fine della vostra domanda. problema di minuscolo. –

risposta

13

Hai diversi errori di battitura nell'esempio. In primo luogo è che non chiude il tag di configurazione, e perché che stai ricevendo solo in un unico file, è perché si chiama:

logger.Info("started async"); 

e dopo che si fa sorprendentemente:

logger.Info("started sync"); 

Avrete non ottenere la scrittura nel secondo file perché in realtà non si accede ad esso.

E in console ottengo dal codice:

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

Per informazioni futuro, l'avete fatto correttamente mettendo additività false, perché questo significa che i taglialegna non erediteranno dal logger principale.Come circa la dichiarazione:

voglio avere 2 logger con diverse appenders di file e limitare ogni scrivere nel logger principale

io non lo capisco. Se vuoi che i tuoi logger scrivano su questi file mentre il logger principale con un appender della console, ad esempio, rimuovi l'additività e scriveranno alla console e ai propri file. Anche testato e funziona molto bene.

Ho letto il tuo commento. Ora aggiungo il codice che sto usando e ottenere quello che ti serve:

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

E l'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> 

versione Log4net: 1.2.13.0 con .NET 4.0 Mi dica per favore se ottieni quello che vuoi

+0

XMight, thx per riproduzione. Errori di battitura non influenzano l'applicazione, solo il mio post (comunque - risolto). Ho ricreato il progetto dal codice che avevo postato qui prima e con log4net 1.2.13.0 non funziona affatto - entrambi i file sono vuoti (nonostante sia passato a logger2.Info ("started sync");). Inoltre, solo "FileInfoAppenderA" è elencato in entrambi i logger. E per chiarire il mio obiettivo: 1) è necessario logger1 -> accedere a asyng.log SOLO 2) necessario logger2 -> accedere solo a sync.log. 3) Non logger1, non logger2 dovrebbe accedere al logger root (qualunque cosa sia registrata lì) – LaoR

+0

finalmente ho ottenuto qual era il problema) Riderete) Vedete la differenza tra il mio < 'and yours' '? Sì, è stato solo il nome attributo maiuscolo/minuscolo 'nome! = Nome'. Questo è il motivo per cui i miei logger non hanno eseguito il login nei file corretti ed entrambi erano vuoti. – LaoR

+0

Sono felice che tu abbia trovato il problema;) – XMight

0

Questa configurazione ha funzionato per me:

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

Good Luck!