2009-01-22 11 views
35

Ich möchte Log4net Protokolldateien (mit RollingFileAppender) in einen Unterordner des allgemeinen Anwendungsdatenordners schreiben (z. B. C: \ Dokumente und Einstellungen \ All Users \ Anwendungsdaten \ Company \ Product \ Logs).
jedoch auf Win XP gibt es keine Umgebungsvariable, die diesen Ordner angibt. Wir haben %ALLUSERSPROFILE%, haben wir %APPDATA%, aber es gibt nichts, wie %ALLUSERSAPPDATA%.
Programatically, konnte ich verwenden Environment.SpecialFolder.CommonApplicationData, aber ich brauche es in der log4net Config zu setzen, so etwas wie diese:Wie häufig Anwendungsdatenordner für log4net angeben?

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="%ALLUSERSAPPDATA%\Company\Product\Logs\error.log" /> 
</appender> 

OK, wir könnten dies in unserem Setup definieren, aber vielleicht kommt jemand mit einer besseren Idee ?

+0

Bitte korrigieren Sie die Frage Titel Rechtschreibung "specifiy" –

+0

Per den Link in @ cutelike Antwort, ab 1.2.11 können Sie einfach einen PatternString-Ausdruck wie [% envFolderPath {CommonApplicationData} '] (http://stackoverflow.com/questions/1535736/log4net-how-can-i-change-the-file-location-programmatical-) verwenden. c/1535998 # 1535998). – Ashe

Antwort

12

This posting auf der log4net Mailingliste erklärt, wie Sie Ihre eigenen Weg Ersetzungsvariablen definieren.

+0

Danke, das gab mir die richtige Idee. Ich werde eine Eigenschaft definieren und eine PatternString für den Ordner in der Konfigurationsdatei verwenden. – user57474

+0

Verbindung ist tot ... – Matt

+0

Sie können Lösung von akzeptierten Antwort von hier http://StackOverflow.com/Questions/1535736/How-Can-Ichange-the-File-Location-Programmatically/1535998#1535998 verwenden. Diese Lösung arbeitet an Win XP und allen folgenden Systemen – user2126375

33

Wir können das nur verwenden:

<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/> 

Es funktioniert gut.


Diese Linie kann einfach in Ihre aktuelle appender Konfiguration eingefügt:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/> 
</appender> 
+0

Diese Lösung funktioniert nicht mit Win XP, da es keine gültige Auflösung für $ {ALLUSERSPROFILE} gibt. Lösung für alle Systeme (Win XP und folgende) ist in der akzeptierten Antwort von hier http://stackoverflow.com/questions/1535736/how-can-i-change-the-file-location-programmatically/1535998#1535998 – user2126375

+2

In Windows XP, ALLUSERSPROFILE ist vorhanden und standardmäßig C: \ Dokumente und Einstellungen \ Alle Benutzer. Dies sollte also funktionieren, es sei denn, Sie haben ein Berechtigungsproblem. – pduncan

11

Hier ist der vollständige Code aus der log4net Mailingliste, dass pilif verknüpft:

Grundsätzlich ist das Verfahren ein implementieren benutzerdefinierter Musterkonverter für die log4net-Konfigurationsdatei

Erste diese Klasse zu Ihrem Projekt hinzufügen:

public class SpecialFolderPatternConverter : log4net.Util.PatternConverter 
{ 
    override protected void Convert(System.IO.TextWriter writer, object state) 
    { 
     Environment.SpecialFolder specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true); 
     writer.Write(Environment.GetFolderPath(specialFolder)); 
    } 
} 

dann die Datei Parameter Ihres FileAppender setzen sich wie folgt zusammen:

<file type="log4net.Util.PatternString"> 
    <converter> 
     <name value="folder" /> 
     <type value="MyAppName.SpecialFolderPatternConverter,MyAppName" /> 
    </converter> 
    <conversionPattern value="%folder{CommonApplicationData}\\SomeOtherFolder\\log.txt" /> 
</file> 

Grundsätzlich ist die %folder es am Konverter suchen erzählt folder genannt was auf die SpecialFolderPatternConverter-Klasse verweist. Anschließend ruft sie Convert auf dieser Klasse, in der Common vorbei (oder was auch immer) Enum-Wert.

Offenbar in der nächsten Version von log4net (1.2.11) wird es eine einfachere Methode geben, wie beschrieben here.

+0

wie man diesen Konverter benutzt (was ich auch in der offiziellen log4net-Seite fand, aber nicht erfolgreich war) in '

2

Komplette und Arbeitslösung - Inhalt meiner log4net.config Datei. In aktuellem Log4Net gibt es keine Notwendigkeit für

<?xml version="1.0"?> 
<log4net> 
    <root> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
    <file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\MyProject\\Logs\\log.txt" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="100MB" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <ConversionPattern type="log4net.Util.PatternString" value="%%-5p %%d{yyyy-MM-dd HH:mm:ss} - %%m%%n" /> 
    </layout> 
    </appender> 
</log4net> 
+1

Dies ist nun die richtige Antwort. Vielen Dank! –

+1

Versucht dies, es hat nur einen doof Ordner mit einem Prozent in meiner Webanwendung erstellt. – jpierson

0

nun mehr eigenen Muster-Wandler zu schreiben (im Jahr 2018 Februar) gemäß log4net Version 2.0.8.0.

Sie können ohne Konverter verwenden, um Umgebungsvariablen wie folgt abzurufen.

<file type="log4net.Util.PatternString" value="%envFolderPath{CommonApplicationData}\\mylogfile.txt" /> 

Siehe: log4net.Util.PatternString Klasse Dokumentation für weitere Details.