¿Cómo especificar la carpeta de datos de aplicaciones comunes para log4net?


Quiero que log4net escriba archivos de registro (usando RollingFileAppender) en una subcarpeta de la carpeta de datos de aplicaciones comunes (p. ej. C:\Documents y Configuración\Todos los usuarios \ Datos de la aplicación \ Empresa \ Producto \ Registros).
Sin embargo, en Win XP, no hay ninguna 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>

OK, podríamos definir esto en nuestra configuración, pero tal vez alguien viene con una idea mejor?

Author: Gavin Miller, 2009-01-22

6 answers

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

 12
Author: pilif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 13:00:59

Solo usamos esto:

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

Funciona muy bien.


Esta línea simplemente se puede insertar en la configuración actual del appender:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
   <param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>
</appender>
 33
Author: pduncan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 15:58:07

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

Básicamente el método es 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 apunta a la clase SpecialFolderPatternConverter. Luego llama Convert a que class, 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í.

 11
Author: codeulike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:00:35

Solución completa y funcional - contenido de mi Log4net.archivo de configuración. En la versión real de Log4Net no hay necesidad de escribir propio convertidor de patrones más

<?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
Author: user2126375,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-12 18:09:31

Ahora (en FEBRERO de 2018) según la versión 2.0.8.0 de log4net.

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" />

Refer: log4net.Útil.PatternString documentación de la clase para más detalles.

 0
Author: Mohamed Navas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-19 11:01:30

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\

 0
Author: Apfelkuacha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 16:46:43