2017-05-30 3 views
0

Ich habe ein C# -Projekt, das auf ein anderes C# -Projekt verweist. Beide haben app.config-Dateien, die log4net-Konfigurationseinstellungen enthalten. Wenn ich meinen Code ausführe, wird nur die Protokolldatei für das Hauptprojekt angezeigt, und die Protokolleinträge des referenzierten Projekts werden in der Protokolldatei des Hauptprojekts angezeigt.Warum sind Log4Net-Einträge in der Protokolldatei eines anderen Projekts enthalten?

Hier ist meine app.config für mein Hauptprojekt:

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
</configSections> 

...

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="MainProject.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="100MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%level | %date{ISO8601} | %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="RollingFileAppender" /> 
    </root> 
</log4net> 

Mein Hauptprojekt ist ein Azure Cloud-Instanz Projekt, so hat es eine Klasse, die die WorkerRole definiert. Der log4net-Initialisierungscode sieht folgendermaßen aus:

//Using statements 
//... 
[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

namespace MainProject 
{ 
    public class WorkerRole : RoleEntryPoint 
    { 
     private static readonly log4net.ILog log4netLogger = log4net.LogManager.GetLogger(typeof(WorkerRole)); 

//... 
log4netLogger.Info("This is a MainProject log entry") 
//... 

Mein referenziertes Projekt ist eine Klassenbibliothek mit einer Klasse. Hier ist die app.config für meine ReferencedProject:

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
</configSections> 

...

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="ReferencedProject.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="100MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%level | %date{ISO8601} | %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="RollingFileAppender" /> 
    </root> 
</log4net> 

Die log4net Initialisierungscode in dem eine Klasse ReferencedProject wie folgt aussieht:

//Using statements 
//... 
[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

namespace ReferencedProject 
{ 
    public class ReferencedProjectClass : IDisposable 
    { 
     private static readonly log4net.ILog log4netLogger = log4net.LogManager.GetLogger(typeof(ReferencedProjectClass)); 

//... 
log4netLogger.Info("This is a ReferencedProject log entry") 
//... 

Als ich das laufen Code lokal, die einzige Logdatei, die generiert wird, ist MainProject.log. Diese Logdatei enthält Einträge von MainProject und ReferencedProject. Es sieht so aus:

INFO | 2017-05-30 07:49:38,419 | This is a ReferencedProject log entry 
INFO | 2017-05-30 07:49:38,421 | This is a MainProject log entry 

Es ist wahrscheinlich etwas, das ich nicht verstehe, wie LogManager.GetLogger Logger verwaltet. Kann jemand darauf hinweisen, was ich falsch mache?

Antwort

2

Zur Laufzeit kann nur eine app.config verwendet werden. Sie können nicht verschiedene app.config pro Projekt verwenden.

Und weil Sie das Hauptprojekt ausführen, nimmt es die app.config aus dem Hauptprojekt und Ihre app.config für mein ReferencedProject wird einfach ignoriert.

Verwandte Themen