Domanda

Voglio che log4net scriva i file di registro (usando RollingFileAppender) in una sottocartella della cartella dei dati dell'applicazione comune (ad es. C: \ Documents and Settings \ All Users \ Application Data \ Company \ Product \ Logs). Tuttavia, su Win XP, non esiste una variabile di ambiente che specifica questa cartella. Abbiamo % ALLUSERSPROFILE% , abbiamo % APPDATA% , ma non c'è niente come % ALLUSERSAPPDATA% .
A livello di codice, potrei usare Environment.SpecialFolder.CommonApplicationData , ma devo metterlo nella configurazione di log4net, qualcosa del genere:

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

OK, potremmo definirlo nella nostra configurazione, ma forse qualcuno ha un'idea migliore?

È stato utile?

Soluzione

Questo post sulla mailinglist log4net spiega come definire il tuo variabili di sostituzione del percorso.

Altri suggerimenti

Usiamo solo questo:

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

Funziona benissimo.


Questa riga può essere semplicemente inserita nella configurazione dell'appender corrente:

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

Ecco il codice completo dalla mailing list log4net che pilif collegato a:

Fondamentalmente il metodo è implementare un convertitore di pattern personalizzato per il file di configurazione log4net.

Per prima cosa aggiungi questa classe al tuo progetto:

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));
    }
}

Quindi imposta il parametro File del tuo FileAppender come segue:

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

Fondamentalmente la % folder dice di guardare il convertitore chiamato folder che lo punta alla classe SpecialFolderPatternConverter. Quindi chiama Convert su quella classe, passando il valore enum CommonApplicationData (o qualunque altra cosa).

Apparentemente nella prossima versione di log4net (1.2.11) ci sarà un metodo più semplice, come descritto qui .

Soluzione completa e funzionante - contenuto del mio file Log4net.config. Nella versione attuale di Log4Net non è più necessario scrivere il proprio convertitore di pattern

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

Nella versione corrente di log4net (2.0.8.0) potresti semplicemente usare

< valore file = " $ {ProgramData} \ myFolder \ LogFiles \ " / > per C: \ ProgramData

$ {LocalAppData} per C:\Users\user\AppData\Local\

e $ {AppData} per C:\Users\user\AppData\Roaming\

Ora (nel 2018 FEB) come da log4net versione 2.0.8.0.

È possibile utilizzare senza alcun convertitore per ottenere le variabili d'ambiente come segue.

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

Consultare: log4net.Util.PatternString documentazione di classe per maggiori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top