2010-08-18 21 views
23

Estoy escribiendo una pequeña utilidad de conversión de archivos. Los archivos se convierten automáticamente cuando se sueltan en un directorio.Agregar/eliminar archivos de registro durante el tiempo de ejecución en NLog

Estoy usando NLog para el registro. Además de un archivo de registro central que se configura usando NLog.conf (y que recibe todos los mensajes generados), me gustaría crear un archivo de registro adicional para cada archivo de entrada, que tenga un nombre similar y contenga todos los mensajes de registro escritos durante el proceso de conversión.

Desafortunadamente, parece que no puedo encontrar la forma de agregar correctamente un nuevo objetivo de archivo junto con la regla apropiada durante el tiempo de ejecución. Quiero que todos los objetos Logger escriban en el nuevo archivo de registro durante el proceso de conversión.

he intentado algo así como

var logfile = new NLog.Targets.FileTarget(); 
logfile.FileName = fileName + ".log"; 
logfile.KeepFileOpen = true; 
logfile.Initialize(); 
var rule = new NLog.Config.LoggingRule("*", logfile); 
NLog.LogManager.Configuration.LoggingRules.Add(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 
// 
// Proceed with converting file 
// 
logfile.Flush(); 
NLog.LogManager.Configuration.LoggingRules.Remove(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 

Pero ningún archivo de registro fue creado.

¿Qué hice mal? ¿Alguna idea?

Respuesta

47

El segundo post en este hilo me llevó a la solución: http://nlog-project.org/forum.html#nabble-td1685349

Tienes que conseguir la configuración actual Nlog, realizar cambios en este objeto LoggingConfiguration, a continuación, asignar de nuevo a LogManager.Configuration.

Este es el código utilicé:

LoggingConfiguration config = LogManager.Configuration; 

var logFile = new FileTarget(); 
config.AddTarget("file", logFile); 

logFile.FileName = fileName + ".log"; 
logFile.Layout = "${date} | ${message}"; 

var rule = new LoggingRule("*", LogLevel.Info, logFile); 
config.LoggingRules.Add(rule); 

LogManager.Configuration = config; 

logger.Info("File converted!"); 
+9

La línea con la reasignación es muy importante: LogManager.Configuration = config; – habakuk

+2

Para aclarar ** La línea con la reasignación es muy importante: LogManager.Configuration = config; ** Esto es cierto debido a la forma en que NLog ha escrito los captadores y definidores para la propiedad de Configuración. No es bonito, pero tiene que establecerse nuevamente con un objeto cambiado; no puedes cambiar la propiedad directamente. – zshift

+0

Tuve que reasignar la variable del registrador al final para que funcione: logger = LogManager.GetCurrentClassLogger(); – Henry

Cuestiones relacionadas