2012-08-03 19 views
5

Me gustaría crear un RollingFileAppender de log4net que crea un archivo nuevo cada vez que se inicia el programa. Puede rodar si el archivo llega a ser grande pero debe rodar cada vez que se inicia la aplicación. El appender no se debe agregar si se configura otro appender en la configuración. En esencia, se crea una configuración de registro predeterminada que puede anularse cambiando el archivo de configuración.Configurar log4net RollingFileAppender en el código que se ejecuta una vez por inicio de la aplicación

Respuesta

8

Después de unir una serie de otras publicaciones, finalmente conseguí que funcionara. La implementación está en una clase de contenedor estático. Todo lo que tiene que hacer es pegar este código en su aplicación, establecer la ubicación para crear el archivo y llamar a Log.Configure() cuando se inicia la aplicación.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Windows.Forms; 
using System.Windows.Threading; 
using log4net; 
using log4net.Core; 
using log4net.Appender; 
using log4net.Repository.Hierarchy; 
using System.Reflection; 
using System.IO; 

namespace [Your Namespace] 
{ 
    public static class Log 
    { 
     private static bool isConfigured = false; 
     private static ILog iLog; 

     public static void Configure() 
     { 
      if (isConfigured) 
       return; 

      var loggerName = typeof(DiagnosticsManager).FullName; 

      var logger = (log4net.Repository.Hierarchy.Logger)log4net.LogManager.GetRepository().GetLogger(loggerName); 
      var ilogger = log4net.LogManager.GetRepository().GetLogger(loggerName); 

      //Add the default log appender if none exist 
      if(logger.Appenders.Count == 0) 
      { 
       var directoryName = "[Your directory name here. e.c. 'C:\ProgramData\AppName\Logs']"; 

       //If the directory doesn't exist then create it 
       if(!Directory.Exists(directoryName)) 
        Directory.CreateDirectory(directoryName); 

       var fileName = Path.Combine(directoryName, "[Your static file name here. e.c. 'AppName.log']"); 

       //Create the rolling file appender 
       var appender = new log4net.Appender.RollingFileAppender(); 
       appender.Name = "RollingFileAppender"; 
       appender.File = fileName; 
       appender.StaticLogFileName = true; 
       appender.AppendToFile = false; 
       appender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size; 
       appender.MaxSizeRollBackups = 10; 
       appender.MaximumFileSize = "10MB"; 
       appender.PreserveLogFileNameExtension = true; 

       //Configure the layout of the trace message write 
       var layout = new log4net.Layout.PatternLayout() 
       { 
        ConversionPattern = "%date{hh:mm:ss.fff} [%thread] %-5level - %message%newline" 
       }; 
       appender.Layout = layout; 
       layout.ActivateOptions(); 

       //Let log4net configure itself based on the values provided 
       appender.ActivateOptions(); 
       log4net.Config.BasicConfigurator.Configure(appender); 
      } 

      iLog = LogManager.GetLogger(loggerName); 
      isConfigured = true; 

      Info("Logging Configured at " + DateTime.Now.ToString("g")); 
     } 

     public static event EventHandler<ExceptionLoggedEventArgs> ExceptionLogged; 

     public static void Debug(object message) { Configure(); iLog.Debug(message); } 
     public static void Debug(object message, Exception exception) { Configure(); iLog.Debug(message, exception); } 

     public static void Error(object message) { Configure(); iLog.Error(message); } 
     public static void Error(object message, Exception exception) { Configure(); iLog.Error(message, exception); } 

     public static void Fatal(object message) { Configure(); iLog.Fatal(message); } 
     public static void Fatal(object message, Exception exception) { Configure(); iLog.Fatal(message, exception); } 

     public static void Info(object message) { Configure(); iLog.Info(message); } 
     public static void Info(object message, Exception exception) { Configure(); iLog.Info(message, exception); } 

     public static void Warn(object message) { Configure(); iLog.Warn(message); } 
     public static void Warn(object message, Exception exception) { Configure(); iLog.Warn(message, exception); } 

    } 

} 
+0

+1 para publicar la solución. Me fue útil hoy porque quería hacer algo similar. –

Cuestiones relacionadas