2010-03-05 29 views
19
  1. Quiero guardar todos los registros de cada día en la carpeta llamada YYYYMMdd - log4net debería manejar la creación de una nueva carpeta según el sistema datetime - ¿cómo puedo configurar esto?
  2. Quiero guardar todos los registros durante el día en n archivos de 1 MB. No quiero reescribir los archivos antiguos, pero realmente tengo todos los registros durante un día. ¿Cómo puedo configurar esto?

estoy usin C#¿Cómo puedo configurar log4net para registrar mis archivos en diferentes carpetas cada día?

Saludos Alex

Respuesta

1

creo, puede crear su propia appender, basado en la clase FileAppender. Es posible que deba sobrescribir el método OpenFile para crear un archivo en la ubicación correcta.

1

Puede usar el rollinglogfileappender, que crea archivos nombrados por fecha y comienza un nuevo archivo a la medianoche. Luego solo escriba un script que los mueva a un mapa correcto en 00.01.

Como para el registro de todos los archivos durante un día con un máximo de 1 MB por archivo, he aquí un ejemplo:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="Logging\\MWLog"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Composite"/> 
    <datePattern value="-yyyyMMdd"/> 
    <maxSizeRollBackups value="-1"/> 
    <maximumFileSize value="1MB"/> 
    <countDirection value="1"/> 
    <encoding value="utf-8"/> 
    <staticLogFileName value="false"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/> 
    </layout> 
</appender> 
10

Gracias a todos. Hemos creado SortByFolderFileAppender, que hereda de RollingFileAppender

Ejemplo del resultado final: algún lugar \ Logs \ 20100305 \ Client-104615,0

namespace CustomLogging 
{ 
    public class SortByFolderFileAppender : log4net.Appender.RollingFileAppender 
    { 
    protected override void OpenFile(string fileName, bool append) 
    { 
     //Inject folder [yyyyMMdd] before the file name 
     string baseDirectory = Path.GetDirectoryName(fileName); 
     string fileNameOnly = Path.GetFileName(fileName); 
     string newDirectory = Path.Combine(baseDirectory, DateTime.Now.ToString("yyyyMMdd")); 
     string newFileName = Path.Combine(newDirectory, fileNameOnly); 

     base.OpenFile(newFileName, append); 
    } 
    } 
} 
<appender name="SortByFolderFileAppender" type="CustomLogging.SortByFolderFileAppender"> 
    <file type="log4net.Util.PatternString" value="Logs\Client"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Composite"/> 
    <datePattern value="-HHmmss"/> 
    <maxSizeRollBackups value="40"/> 
    <maximumFileSize value="1MB"/> 
    <countDirection value="1"/> 
    <encoding value="utf-8"/> 
    <staticLogFileName value="false"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/> 
    </layout> 
</appender> 
+0

¿Es posible en OpenFile agregarse al registro actual? Me gustaría agregar un par de mensajes a mi appender personalizado de esa manera. –

+0

Logré obtener algo escrito en stderr usando LogLog.Warn/LogLog.Error pero quizás no sea posible que los métodos de log4net tengan acceso al registro actual. –

+0

Esta solución no funcionará como se espera si staticLogFileName se establece en True. En mi caso, quiero diferentes carpetas para cada día, pero el mismo nombre de archivo dentro. Si esta propiedad se establece en true, log4net copia el archivo en la carpeta especificada para la propiedad File del appender, y la carpeta inyectada permanece vacía. – XMight

17

Prueba esto (Debe estar bien!):

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="logs\\" /> 
    <appendToFile value="true" /> 
    <DatePattern value="yyyy\\\\MM\\\\dd'.inf.log'" /> 
    <rollingStyle value="Date" /> 
    <param name="StaticLogFileName" value="false" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <header value="[Header]&#13;&#10;" /> 
    <footer value="[Footer]&#13;&#10;" /> 
    <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" /> 
    </layout> 
</appender> 

Se creará un archivo de registro llamado 'logs \ 2010 \ 04 \ 02.inf.log' (fecha de envío 2010-04-02)

+1

Funciona a la perfección. – Stevus

+0

¿qué indican las comillas simples? '.inf.log' –

+0

funciona perfectamente, solo una nota, solo doble barra invertida debería ser suficiente. '' and '' debería funcionar bien. –

1

Para compilar a partir de la respuesta anterior utilizando SortByFolderFileAppender.

Así es como resolvimos el problema utilizando la fecha de actualización para los nombres de archivo de registro. Cambié staticLogFileName a verdadero para que todo el nombre de archivo pase al método OpenFile.

Si el nombre del archivo termina en ".log", no es necesario agregar nada. Supongo que se produjo algún tipo de bloqueo y quiero que log4net intente usar el mismo nombre de archivo nuevamente, esperando que se haya liberado el bloqueo anterior.

Aunque no estoy seguro de si esto podría causar una llamada infinita a OpenFile si el archivo está bloqueado y no lo suelta. Creamos un servicio web utilizando el patrón de consumidor productor para registrar todo en una ubicación desde todas las aplicaciones en el sistema, que actualmente es diez y está creciendo.

No necesitamos incluir log4net en ninguna de las otras aplicaciones, pero necesitábamos crear una clase de cliente web a la que puedan acceder todas las aplicaciones para usarla para iniciar sesión en el servicio web.

El resultado para el nombre del archivo es "Logs \ Client \ 2017 \ 11 \ 08.log" y obviamente cambia todos los días.

protected override void OpenFile(string fileName, bool append) 
{ 
    // append "\yyyy\mm\dd.log" to create the correct filename. 
    if (!fileName.EndsWith(".log")) 
     fileName = [email protected]"{fileName}\{DateTime.Now:yyyy\\MM\\dd}.log"; 

    base.OpenFile(fileName, append); 
} 

Modificación de la configuración desde arriba.

<appender name="xxxRollingFileAppender" type="namespace.xxxRollingFileAppender"> 
    <file value="Logs\Client"/> 
    <staticLogFileName value="true"/> 
    <appendToFile value="true"/> 
    <maxSizeRollBackups value="40"/> 
    <maximumFileSize value="1MB"/> 
    <encoding value="utf-8"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/> 
    </layout> 
</appender> 
Cuestiones relacionadas