41 Stimmen

Wie verwende ich eine GlobalContext-Eigenschaft in einem log4net-Appendernamen?

Ich versuche, einen log4net-Dateipfad anzupassen, um eine Eigenschaft zu verwenden, die ich in der log4net.GlobalContext.Properties Wörterbuch.

log4net.GlobalContext.Properties["LogPathModifier"] = "SomeValue";

Ich kann sehen, dass dieser Wert korrekt eingestellt ist, wenn ich ihn debugge. und dann in meiner Konfiguration

<file type="log4net.Util.PatternString" 
      value="Logs\%appdomain_%property{LogPathModifier}.log" />

Bei der Ausgabe erhalte ich jedoch "_(null).log" am Ende des Pfades. Woran liegt das?

59voto

Dscoduc Punkte 7554

Ich lief in das gleiche Verhalten und löste es durch die Einstellung der globalen Variable vor dem Aufruf der XmlConfigurator... Hier ist, was ich erfolgreich verwenden:

log4net.config Details:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
  <File type="log4net.Util.PatternString" value="App_Data/%property{LogName}" />
  ...
</appender>

Global.asax Details:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Global.asax");
void Application_Start(object sender, EventArgs e) 
{
    // Set logfile name and application name variables
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;

    // Load log4net configuration
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);

    // Record application startup
    log.Debug("Application startup");
}

Ich hoffe, das hilft...

1 Stimmen

Ich hatte genau das gleiche Problem, in meinem Fall habe ich versucht, in die gleiche Datei von 2 verschiedenen Prozessen anmelden. Es wurde in 2 verschiedenen Dateien, aber die Einstellung der globalen Variable vor dem Aufruf der XmlConfigurator in der zweiten app löste das Problem. Ich danke Ihnen vielmals. +1

1 Stimmen

I verwendet System.Reflection.Assembly.GetExecutingAssembly().GetName().‌​Name für den Namen der Anwendung

0 Stimmen

@Dscoduc Welche Klasse enthält Server.MapPath? Könnten Sie bitte die Details mitteilen?

17voto

Typ= hinzufügen log4net.Util.PatternString in das Element Datei

4voto

Das Problem (denke ich) ist, dass Sie den Logger GET(GetLogger), bevor Sie den Namen festlegen und die Konfiguration laden...

Versuchen Sie, den Logger so zu deklarieren: private static log4net.ILog _pLog und dann in der Anwendung_Start tun:

void Application_Start(object sender, EventArgs e) 
{
    // Set logfile name and application name variables
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;

    // Load log4net configuration
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);

    //Get the loger
    _pLog = log4net.LogManager.GetLogger("Global.asax");

    // Record application startup
    pLog .Debug("Application startup");
}

Die Reihenfolge ist also:

// Set logfile name and application name variables
// Load log4net configuration
// get the logger
// Record application startup

1voto

Dillie-O Punkte 28749

Wurde der Logger über die Global- oder Main-Methode in der Anwendung initialisiert? Es könnte sein, dass der GlobalContext noch nicht initialisiert worden ist.

0 Stimmen

Ich habe LogManager.GetLogger() aufgerufen, bevor ich die Eigenschaft gesetzt habe. Außerdem funktioniert die Protokollierung korrekt, es ist nur so, dass der Dateiname nicht den benutzerdefinierten Wert aufnimmt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X