2009-01-22 7 views
35

Quiero 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 hay una variable de entorno que especifique esta carpeta. Tenemos %ALLUSERSPROFILE%, tenemos %APPDATA%, pero no hay nada como %ALLUSERSAPPDATA%.
Programatically, que podría utilizar Environment.SpecialFolder.CommonApplicationData, pero tengo que ponerlo en la configuración de log4net, algo como esto:¿Cómo especificar la carpeta de datos de aplicación común para log4net?

<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 alguien se le ocurre una idea mejor ?

+0

por favor, corrija el título de la pregunta deletreando "specifiy" –

+0

Según el enlace en la respuesta de @codeulike, a partir de 1.2.11, simplemente puede usar una expresión PatternString como ['% envFolderPath {CommonApplicationData}'] (http://stackoverflow.com/questions/1535736/log4net-how-can-i-change-the- file -location-programmatic- c/1535998 # 1535998). – Ashe

Respuesta

12

This posting en la lista de correo log4net explica cómo puede definir sus propias variables de reemplazo de ruta.

+0

Gracias, esto me dio la idea correcta. Definiré una propiedad y usaré PatternString para la carpeta en el archivo de configuración. – user57474

+0

el enlace está muerto ... – Matt

+0

Puede usar la solución de la respuesta aceptada desde aquí http://stackoverflow.com/questions/1535736/how-can-i-change-the- file-location-programmatically/1535998 # 1535998. Esta solución está funcionando en Win Xp y en todos los sistemas siguientes – user2126375

33

simplemente Utilizamos esta:

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

Funciona muy bien.


Esta línea simplemente se puede insertar en la configuración appender actual:

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

Esta solución no funcionará en Win Xp, ya que no hay una solución válida para $ {ALLUSERSPROFILE}. La solución para todos los sistemas (Win Xp y siguientes) es la respuesta aceptada desde aquí http://stackoverflow.com/questions/1535736/how-can-i-change-the- file-location-programmatically/1535998#1535998 – user2126375

+2

En Windows XP, ALLUSERSPROFILE existe y tiene como valor predeterminado C: \ Documents and Settings \ All Users, por lo que debería funcionar, a menos que tenga un problema de permisos. – pduncan

11

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

Básicamente, el método consiste en poner en práctica una convertidor de patrón personalizado para el archivo de configuración log4net.

primero Añadir 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, establecer el parámetro Archivo de la 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 dice que a la vista del convertidor llamado folder que lo apunta a la clase SpecialFolderPatternConverter. Luego llama al Convert en esa clase, pasando el valor enum CommonApplicationData (o lo que sea) enum.

Parece ser que en la próxima versión de log4net (1.2.11) habrá un método más simple, como se describe en here.

+0

cómo usar este convertidor (que también encontré en el sitio oficial de log4net pero no tuvo éxito) en la sección '

2

Solución completa y de trabajo: contenido de mi archivo Log4net.config. En la versión actual de Log4net no hay necesidad de escribir propio convertidor patrón 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> 
+1

Esta es ahora la respuesta correcta. ¡Gracias! –

+1

Intenté esto, acaba de crear una carpeta ridícula con un porcentaje en ella en mi aplicación web. – jpierson

0

ahora (en 2018 FEB) de acuerdo con la versión 2.0.8.0 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" /> 

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

Cuestiones relacionadas