2011-01-13 9 views
0

Gibt es eine Variable, die ich verwenden könnte, um meine Protokolldateien zu benennen?Wie log4net-Ausgabedateien mit dem Assemblynamen benennen?

<file value="${ALLUSERSPROFILE}\${AssemblyName}.log.xml" /> 

Wo

  • ${ALLUSERSPROFILE} funktioniert wirklich
  • ${AssemblyName} nicht, es ist etwas, das ich zur Illustration nur aus, was ich will.
+0

NLog eine Variable ähnlich zu dem, was ich will: '$ {Prozessname}' –

Antwort

1

Nicht standardmäßig.

Diese Syntax dient zum Erweitern von Windows Environment Variables. Während ALLUSERSPROFILE eine Standardumgebungsvariable ist, ist AssemblyName nicht. Sie müssten AssemblyName selbst einstellen, was als dynamische Lösung nicht einfach möglich ist.

0

Prozessname in NLog ist verwandt mit PatternLayout in log4net; Sie sind beide Teil des Layouts/Renderings der Protokolle selbst.

Wenn Sie eine Umgebungsvariable in Ihrer Anwendung verwenden möchten, erzwingen Sie entweder die Erstellung als Teil der Installation oder erstellen Sie Ihre eigene innerhalb Ihres Codes. Ein C# -Beispiel ist here.

Wenn diese Option nicht Ihren Anforderungen entspricht, können Sie den Pfad wie in der Abbildung gezeigt dynamisch festlegen here.

0

Sie könnten Ihren eigenen Musterlayoutkonverter schreiben. Ich stellte eine Probe here und ich denke, dass es einfach ist, dass so zu modifizieren, dass sie den Namen der Assembly schreibt ...

0

Eine weitere Option ist, eine globale Eigenschaft bei der Initialisierung zu definieren:

GlobalContext.Properties["pid"] = System.Diagnostics.Process.GetCurrentProcess().Id; 
this.logger = log4net.GetLogger("LoggerSample"); 

In Ihrem Konfigurationsdatei, können Sie die "pid" Eigenschaft wie folgt verwendet werden:

<param name="ConversionPattern" value="%d;%property{log4net:HostName};%property{pid};%t;%p;%c;%M;%L;%m%n" /> 

Hope, ich war klar!

br ++ mabra

3

Wie bereits gesagt, gibt es keine eingebauten Platzhalter für den assembly und ein paar Möglichkeiten, um es irgendwie zu erreichen. Eine weitere Möglichkeit besteht darin, einen eigenen Handler/Konverter mit dem Log4Net-Framework zu registrieren.

Grundsätzlich tun Sie das gleiche, das die log4net.Util.PatternString Klasse intern tut (und Sie könnten den relevanten Quellcode für ein vollständigeres "Beispiel" als die unten angegebenen Fragmente überprüfen).

Beispiel:

<file value="[ASSEMBLYNAME].log" type="MyExpressionHandler, MyAssembly"/> 

Dann wird der Code:

Code eingeben hier

using log4net.Core; 

public sealed class MyExpressionHandler : IOptionHandler 
{ 
    private string m_str; 

    public MyExpressionHandler(string str) 
    { 
     m_str = str; 
    } 

    public void ActivateOptions() 
    { 
    } 

    public string Format() 
    { 
     return m_str.Replace("[ASSEMBLYNAME]", /* ... whatever ... */); 
    } 
} 

dann eine passende "Converter Class" bieten.

internal class MyExpressionHandlerConverter : IConvertTo, IConvertFrom 
    { 
     public bool CanConvertTo(Type targetType) 
     { 
      return (typeof(string).IsAssignableFrom(targetType)); 
     } 

     public object ConvertTo(object source, Type targetType) 
     { 
      MyExpression patternString = source as MyExpression; 
      if (patternString != null && CanConvertTo(targetType)) 
      { 
       return patternString.Format(); 
      } 
      throw ConversionNotSupportedException.Create(targetType, source); 
     } 

     public bool CanConvertFrom(System.Type sourceType) 
     { 
      return (sourceType == typeof(string)); 
     } 

     public object ConvertFrom(object source) 
     { 
      string str = source as string; 
      if (str != null) 
      { 
       return new MyExpression(str); 
      } 
      throw ConversionNotSupportedException.Create(typeof(MyExpression), source); 
     } 
} 

Und schließlich Ihr Wandler an den Log4Net Rahmen bekannt machen:

ConverterRegistry.AddConverter(typeof(MyExpression), typeof(MyExpressionConverter)); 
Verwandte Themen