La mejor manera de establecer dinámicamente una ruta de archivo appender


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 ensamblado para que sea más reutilizable para mis proyectos.

He visto este anterior artículo SO pero no fue exactamente capaz de responder a mi pregunta...

He tenido un dickens de un tiempo tratando de entender los componentes internos de Log4net y esto es lo que se me ocurrió (residiendo en el Global.asax file-Application_Start method):

// 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();
  }
}

¿Puede alguien decirme, 'esto es horrible', o 'esto debería funcionar bien'? Además, si establezco el archivo dinámicamente, puedo esperar que el comportamiento de log4net gire los archivos en función de log4net.configuración del archivo?

Muy apreciado!

 35
Author: Community, 2009-02-21

4 answers

¡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{} para aprovechar:

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
  ....
</appender>

Esto es dinámico just solo tiene que establecer la propiedad log4net "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. He elegido "LogName" para un ejemplo simple, pero puedes tener uno por aplicación si lo desea, siempre y cuando su código sepa cuál es el nombre de propiedad correcto y cuál debería ser el valor correcto.

 86
Author: Eddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-21 02:28:09

En 2015, lo hacemos así:

<file type="log4net.Util.PatternString">
  <conversionPattern value="%appdomain.log" />
</file>

No se requiere ningún otro código.

App domain es el nombre de archivo del ensamblado de ejecución.

 7
Author: Sebastian Häni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-03 13:40:19

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();
 7
Author: Peter J. de Bruin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-23 13:08:00

He estado haciendo lo mismo usando %property{}, pero el archivo se crea como "(nul).registro". A continuación se muestra 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" />
 0
Author: raaga_sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 16:05:21