2012-07-29 40 views

Respuesta

4

No se admite el "fuera de la caja" de log4net. Sin embargo, podría usar RollingFileAppender y crear una clase/método manual para limpiar/eliminar el archivo de registro.

Como referencia, Log4Net: set Max backup files on RollingFileAppender with rolling Date

Otro enfoque para evitar el archivo que se está bloqueada sería para ajustar el nivel de bloqueo mínimo en el archivo de registro a través de:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

Gracias! pero cuando intento eliminar el archivo, recibo una excepción porque log4net captura el archivo. ¿Cómo puedo liberar el archivo de registro de log4net? –

+1

Puede utilizar el método CloseFile() antes de llamar a eliminar. – Darek

+0

Supongo que es una pregunta aparte, pero haz lo que Darek sugirió. Háganos saber cómo se sube y no se olvide de marcar como respondido si esto funciona para usted. – Seany84

6

tuve este problema, también.

Usted necesita esto en su configuración:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

Exactamente lo que estaba buscando. – cdmckay

+0

¡Perfecto! Simple, me gusta –

+0

Sospecho que esto tiene un costo, tal vez alguien puede comentar aquí. Para que esto funcione, es probable que Log4Net cierre el archivo y libere el identificador del archivo. Esta es una operación costosa porque la próxima escritura requerirá asignar un nuevo identificador de archivo y también abrir el archivo. Si bien esto puede parecer "perfecto", es muy probable que cause un golpe de rendimiento. – Jazimov

2

Gracias chicos lo logro borrar el registro. En el bloque appender del archivo de configuración de registro que agregó que la línea:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 

El código que borrar el archivo de registro es:

 RollingFileAppender fileAppender = LogManager.GetRepository() 
         .GetAppenders().FirstOrDefault(appender => appender is RollingFileAppender) as RollingFileAppender; 


     if (fileAppender != null && File.Exists(((RollingFileAppender)fileAppender).File)) 
     { 
      string path = ((RollingFileAppender)fileAppender).File; 
      log4net.Appender.FileAppender curAppender = fileAppender as log4net.Appender.FileAppender; 
      curAppender.File = path; 

      FileStream fs = null; 
      try 
      { 
       fs = new FileStream(path, FileMode.Create); 
      } 
      catch(Exception ex) 
      { 
       (log4net.LogManager.GetLogger(this.GetType())).Error("Could not clear the file log", ex); 
      } 
      finally 
      { 
       if (fs != null) 
       { 
        fs.Close(); 
       } 

      } 
     } 

Gracias a todos

+0

Ver mi respuesta. Creo que esa fue la dirección en la que te indiqué.Me alegro de que lo arregló. – Seany84

1

Si Don No quiero sufrir las implicaciones de rendimiento de tener un bloqueo mínimo (consulte answer), luego puede configurar temporalmente los appenders para usar un bloqueo mínimo, eliminar los archivos y luego traer el comportamiento predeterminado de vuelta.

ejemplo cuando sólo se está utilizando RollingFileAppenders:

// Release the lock on the log4net log files 
var appenders = log4net.LogManager.GetRepository().GetAppenders(); 
foreach (var appender in appenders) 
{ 
    var rollingFileAppender = appender as log4net.Appender.RollingFileAppender; 
    if (rollingFileAppender != null) 
    { 
     rollingFileAppender.ImmediateFlush = true; 
     rollingFileAppender.LockingModel = new log4net.Appender.FileAppender.MinimalLock(); 
     rollingFileAppender.ActivateOptions(); 
    } 
} 

Los archivos son ahora libre para ser eliminado sin problemas.

0

basta con utilizar el comando

File.WriteAllText("C:/Users.../log.xml", ""); 

en el inicio de la aplicación.