c# - remedios - que hacer con dolor de apendice
La mejor forma de establecer dinámicamente una ruta de archivo de apéndice (4)
¡Estás haciendo esto de la manera difícil! Defina su configuración de log4net como XML en el archivo de configuración de su aplicación y use %property{}
como ventaja:
<appender name="YourAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
....
</appender>
Esto es dinámico; solo tiene que establecer la propiedad LogName
" LogName
" antes de inicializar log4net. Por lo tanto, en su código en cualquier momento antes de configurar log4net, establezca el valor deseado de esta propiedad:
string LogName = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["LogName"] = LogName;
Por supuesto, puede usar cualquier nombre de propiedad. Elegí "LogName" para un ejemplo simple, pero puede tener uno por aplicación si lo desea, siempre y cuando su código sepa cuál es el nombre correcto de la propiedad y cuál debería ser el valor correcto.
Estoy tratando de encontrar a alguien más inteligente que yo para validar alguna sintaxis que escribí. La idea es configurar el nombre de archivo de mi RollingFileAppender al nombre del ensamblaje para que sea más reutilizable para mis proyectos.
He visto este artículo anterior de SO, pero no fue exactamente capaz de responder mi pregunta ...
He tenido muchísimo tiempo tratando de comprender los componentes internos de Log4net y esto es lo que se me ocurrió (que residen en el archivo Global.asax - Método Application_Start):
// Bind to the root hierarchy of log4net
log4net.Repository.Hierarchy.Hierarchy root =
log4net.LogManager.GetRepository()
as log4net.Repository.Hierarchy.Hierarchy;
if (root != null)
{
// Bind to the RollingFileAppender
log4net.Appender.RollingFileAppender rfa =
(log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender");
if (rfa != null)
{
// Set the file name based on the assembly name
string filePath =
string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name);
// Assign the value to the appender
rfa.File = Server.MapPath(filePath);
// Apply changes to the appender
rfa.ActivateOptions();
}
}
¿Alguien puede decirme ''esto es horrible'', o ''esto debería funcionar bien''? Además, si configuro dinámicamente el archivo ¿puedo esperar que el comportamiento de log4net gire los archivos según la configuración del archivo log4net.config?
¡Muy apreciado!
Aquí hay una forma de establecer o cambiar el archivo de registro del primer appender en tiempo de ejecución:
var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
appender.File = "C:/whatever.log";
appender.ActivateOptions();
En 2015, lo hacemos así:
<file type="log4net.Util.PatternString">
<conversionPattern value="%appdomain.log" />
</file>
No se requiere otro código
El dominio de la aplicación es el nombre del archivo de la asamblea ejecutora.
He estado haciendo lo mismo usando% property {}, pero el archivo se crea como "(nul) .log". A continuación está el código:
log4net.GlobalContext.Properties["service"] = _servicename.ToString();
_flatFileLogger = LogManager.GetLogger("FlatFileLogger");
_flatFileLogger.Debug(logData.ToString());
He declarado en el archivo XML como
<file type="log4net.Util.PatternString" value="C:/MY_Log/%property{Service}.log" />