ejemplo coloredconsoleappender logging log4net environment-variables

logging - coloredconsoleappender - ¿Cómo especificar la carpeta de datos de aplicación común para log4net?



log4net database (5)

Quiero que log4net escriba archivos de registro (utilizando 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 hay una variable de entorno que especifique esta carpeta. Tenemos %ALLUSERSPROFILE% , tenemos %APPDATA% , pero no hay nada como %ALLUSERSAPPDATA% .
De forma programática, 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 tenga una mejor idea.


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 la documentación de la clase log4net.Util.PatternString para obtener más detalles.


Aquí está el código completo de la lista de correo de pilif que se pilif vincular:

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

A continuación, configure el parámetro Archivo 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, la %folder le dice que mire el convertidor llamado folder que lo apunta a la clase SpecialFolderPatternConverter. Luego llama a Convert en esa clase, pasando el valor enum de CommonApplicationData (o lo que sea).

Aparentemente en el próximo lanzamiento de log4net (1.2.11) habrá un método más simple, como se describe here .


Simplemente usamos esto:

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

Funciona muy bien.

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

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


Solución completa y de trabajo: contenido de mi archivo Log4net.config. En la versión actual de Log4Net ya no es necesario escribir un convertidor de patrones propio

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


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