Pregunta

Deseo que log4net escriba archivos de registro (usando RollingFileAppender) en una subcarpeta de la carpeta de datos de la aplicación común (por ejemplo, C: \ Documents and Settings \ All Users \ Application Data \ Company \ Product \ Logs).
Sin embargo, en Win XP, no existe una variable de entorno que especifique esta carpeta. Tenemos %ALLUSERSPROFILE%, tenemos %APPDATA%, pero no hay nada como %ALLUSERSAPPDATA%.
Programáticamente, podría usar Environment.SpecialFolder.CommonApplicationData, pero necesito ponerlo en la configuración de log4net, algo como esto:

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

Bien, podríamos definir esto en nuestra configuración, pero ¿tal vez a alguien se le ocurre una idea mejor?

¿Fue útil?

Solución

Esta publicación en log4net mailinglist explica cómo puede definir sus propias variables de reemplazo de ruta.

Otros consejos

Simplemente usamos esto:

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

Funciona muy bien.


Esta línea simplemente se puede insertar en su configuración de apéndice actual:

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

Aquí está el código completo de la lista de correo log4net que pilif vinculado a:

Básicamente, el método consiste en implementar un convertidor de patrones personalizado para el archivo de configuración log4net.

Primero agregue esta clase a su proyecto:

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

Luego configure el parámetro File de su FileAppender de la siguiente manera:

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

Básicamente, el %folder le dice que mire el convertidor llamado folder que lo señala a la clase SpecialFolderPatternConverter. Luego llama a Convert en esa clase, pasando el valor de enumeración CommonApplicationData (o lo que sea).

Aparentemente en la próxima versión de log4net (1.2.11) habrá un método más simple, como se describe aquí .

Solución completa y funcional: contenido de mi archivo Log4net.config. En la versión real de Log4Net ya no hay necesidad de escribir su propio convertidor de patrones

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

En la versión actual de log4net (2.0.8.0) simplemente podría usar

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

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

y ${AppData} para C:\Users\user\AppData\Roaming\

Ahora (en 2018 FEB) según log4net versión 2.0.8.0.

Puede usar sin ningún convertidor para obtener Variables de entorno de la siguiente manera.

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

Consulte: log4net.Util.PatternString documentación de clase para más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top