webentwicklung-frage-antwort-db.com.de

Der beste Weg, um einen Appender-Dateipfad dynamisch festzulegen

Ich versuche jemanden zu finden, der klüger ist als ich, um die von mir geschriebene Syntax zu bestätigen. Die Idee ist, den Dateinamen meines RollingFileAppender auf den Namen der Assembly zu konfigurieren, um ihn für meine Projekte wiederverwendbar zu machen. 

Ich habe diesen vorherigen SO Artikel gesehen aber es war nicht in der Lage, meine Frage zu beantworten ...

Ich hatte eine Menge Zeit, als ich versuchte, die inneren Komponenten von Log4net zu verstehen. Dies ist, worauf ich gekommen bin (in der Global.asax-Datei - Application_Start-Methode):

// Bind to the root hierarchy of log4net
log4net.Repository.Hierarchy.Hierarchy root = 
  log4net.LogManager.GetRepository() 
    as log4net.Repository.Hierarchy.Hierarchy;

if (root != null)
{
  // Bind to the RollingFileAppender
  log4net.Appender.RollingFileAppender rfa = 
    (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender");

  if (rfa != null)
  {
    // Set the file name based on the Assembly name
    string filePath = 
      string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name);

    // Assign the value to the appender
    rfa.File = Server.MapPath(filePath);

    // Apply changes to the appender
    rfa.ActivateOptions();
  }
}

Kann mir jemand sagen, "das ist abscheulich" oder "das sollte gut funktionieren"? Wenn ich die Datei dynamisch setze, kann ich weiterhin erwarten, dass das Verhalten von log4net die Dateien basierend auf den Einstellungen der Datei log4net.config dreht.

Sehr geschätzt!

36
Dscoduc

Du machst das auf die harte Tour! Definieren Sie Ihre log4net-Konfiguration als XML in der Konfigurationsdatei Ihrer Anwendung und verwenden Sie %property{} zum Vorteil:

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
  ....
</appender>

Dies ist dynamisch - Sie müssen lediglich die log4net-Eigenschaft "LogName" festlegen. Vorher Sie initialisieren log4net. Legen Sie also in Ihrem Code vor der Konfiguration von log4net den gewünschten Wert dieser Eigenschaft fest:

string LogName = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["LogName"] = LogName;

Natürlich können Sie einen beliebigen Eigenschaftsnamen verwenden. Ich habe "LogName" für ein einfaches Beispiel ausgewählt, aber Sie können für jede Anwendung einen haben, wenn Sie möchten, solange Ihr Code weiß, was der richtige Eigenschaftsname ist und wie der richtige Wert sein sollte.

88
Eddie

2015 machen wir es so:

<file type="log4net.Util.PatternString">
  <conversionPattern value="%appdomain.log" />
</file>

Kein anderer Code erforderlich.

App-Domäne ist der Dateiname der ausführenden Assembly.

8
Sebastian Häni

So können Sie die Protokolldatei des ersten Appenders zur Laufzeit festlegen oder ändern:

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
appender.File = "C:\whatever.log";
appender.ActivateOptions();
8

es funktionierte für mich mit dem Datum <file type="log4net.Util.PatternString" value="./Log/logQueueService%date{yyyy_MM_dd}.log" />

0