it-swarm.com.de

Wie spezifiziere ich den gemeinsamen Anwendungsdatenordner für log4net?

Ich möchte, dass log4net Protokolldateien (mit RollingFileAppender) in einen Unterordner des Ordners mit den allgemeinen Anwendungsdaten schreibt (z. B. C:\Dokumente und Einstellungen\Alle Benutzer\Anwendungsdaten\Firma\Produkt\Protokolle).
Unter Windows XP gibt es jedoch keine Umgebungsvariable, die diesen Ordner angibt. Wir haben %ALLUSERSPROFILE%, wir haben %APPDATA%, aber es gibt nichts Vergleichbares wie %ALLUSERSAPPDATA%.
Programmatisch könnte ich Environment.SpecialFolder.CommonApplicationData verwenden, aber ich muss es in die log4net-Konfiguration einfügen, ungefähr so:

<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 auf eine bessere Idee?

35
user57474

In diesem Beitrag in der log4net-Mailingliste wird erläutert, wie Sie eigene Pfadersatzvariablen definieren können. 

12
pilif

Wir benutzen einfach das:

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

Es funktioniert super.


Diese Zeile kann einfach in Ihre aktuelle Appender-Konfiguration eingefügt werden:

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

Hier ist der vollständige Code aus der log4net-Mailingliste, auf den pilif verlinkt ist:

Grundsätzlich besteht die Methode darin, einen benutzerdefinierten Musterkonverter für die log4net-Konfigurationsdatei zu implementieren.

Fügen Sie diese Klasse zunächst Ihrem Projekt hinzu:

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 richten Sie den File-Parameter Ihres FileAppender wie folgt ein:

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

Im Grunde sagt der %folder den Konverter namens folder, der ihn auf die SpecialFolderPatternConverter-Klasse verweist. Dann ruft sie Convert für diese Klasse auf und übergibt den Enumment-Wert CommonApplicationData (oder was auch immer).

In der nächsten Version von log4net (1.2.11) wird es offenbar eine einfachere Methode geben, wie hier beschrieben.

11
codeulike

Vollständiger und funktionierender Lösungsinhalt meiner Datei Log4net.config. In der aktuellen Version von Log4Net ist es nicht mehr erforderlich, einen eigenen Musterkonverter zu schreiben 

<?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>
3
user2126375

In der aktuellen log4net-Version (2.0.8.0) könnten Sie einfach verwenden 

<file value="${ProgramData}\myFolder\LogFiles\" /> für C:\ProgramData 

${LocalAppData} für C:\Users\user\AppData\Local\

und ${AppData} für C:\Users\user\AppData\Roaming\

0
Apfelkuacha

Jetzt (in 2018 FEB) 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" />

Weitere Informationen finden Sie in der Dokumentation zu log4net.Util.PatternString class.

0
Mohamed Navas