Estoy tratando de encontrar a alguien más inteligente que yo para validar algunos de sintaxis escribí. La idea es configurar el nombre de mi RollingFileAppender a nombre de la asamblea con el fin de hacer más re-utilizable para mis proyectos.

He visto este anterior artículo ASÍ pero no era exactamente capaz de responder a mi pregunta…

He tenido un dickens de un tiempo tratando de entender el interior de los componentes de Log4net y esto es lo que se me ocurrió (que residen en el Mundial.archivo 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’? También, si puedo configurar el archivo de forma dinámica puede todavía esperamos que el log4net comportamiento para rotar los archivos basándose en la log4net.archivo de configuración de la configuración?

Muy apreciada!

InformationsquelleAutor Dscoduc | 2009-02-21

4 Comentarios

  1. 96

    Usted está haciendo esto de la manera difícil! Definir su log4net de configuración XML en la aplicación del archivo de configuración y uso %property{} ventaja:

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

    Este es dinámico — sólo tienes que establecer la log4net propiedad «LogName» antes de inicializar log4net. Así, en el código 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, usted puede utilizar cualquier nombre de la propiedad. He elegido «LogName» para un ejemplo simple, pero usted puede tener uno por la aplicación si usted desea, siempre y cuando el código se sabe lo que el correcto nombre de la propiedad que es y lo que el valor correcto debe ser.

    • Ah, exactamente la razón por la que he publicado esto… parecía más difícil de lo que debería haber sido. Gracias…
    • ¿Sabe usted si hay un método equivalente o manera de hacer esto cuando se utiliza el log4netfactoryadapter? Estoy usando común.el registro en todo mi código y mediante declaración que define la configuración (app.config). He probado el GlobalContext método pero terminan con (null) en mi nombre de archivo, y sé que la variable que estoy usando no es null.
    • Por desgracia, yo no estoy familiarizado con el log4netfactoryadapter. Está usted seguro de que está utilizando GlobalContext ** antes ** log4net se inicializa o usado? Si log4net se utiliza o se inicializa antes de definir sus propiedades, que van a ser nulo.
    • ¿Tenemos que poner esto en el código mediante GlobalContext.Propiedades o hay una manera de configurar el LogName propiedad en un archivo de configuración?
    • Usted podría, por supuesto, su código de lectura que otro archivo de configuración y se usa para establecer el valor deseado en GlobalContext.Propiedades. Pero esto tiene que hacerse antes de que el registro se inicializa.
    • Vale la pena mencionar, que tipo=»log4net.Util.PatternString» la línea es importante. Me pasé dos horas buscando ¿por qué obtengo «%de la propiedad{nombre de archivo}» archivo en la carpeta de Depuración en lugar de «events.txt» en la carpeta de Registro.
    • ¿Qué acerca de multiproceso situación? Parece ser un valor estático. En mi aplicación hay muchas clases de intentar cerrar cosas simultáneamente a diferentes archivos, que los nombres que desea establecer de forma dinámica. ¿Tengo que sincronizar la escribe y cambiar el «LogName» propiedad equivalente para cada hilo?
    • Las declaraciones son contradictorias: «Esto es» dinámico «sólo tienes que establecer la log4net propiedad LogName antes de inicializar log4net.» Si era dinámico, usted podría cambiar. Que implica que no se puede, y el orden es importante. Ese es el opuesto de la dinámica.
    • solución a continuación se ve mucho más fácil si sólo quieres el nombre del ensamblado. Pero esta solución es ideal si usted desea algo más. @shahzbot Si desea que el valor de ser dinámico dependiendo del estado de la aplicación, a continuación, establezca la propiedad de un objeto cuya ToString() método devuelve el valor dinámico que desee.
    • por ejemplo, esto proporciona el nombre del usuario actual, o anónimo, basado en httpcontext: GlobalContext.Properties["User.Identity.Name"] = new DeferredUsernameProvider(); public class DeferredUsernameProvider { public override ToString() { if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.Name != null) { return HttpContext.Current.User.Identity.Name; } return "anonymous"; } }
    • Para mí, ello no sólo trabajar con la recarga de la configuración llamando log4net.Config.XmlConfigurator.ConfigureAndWatch("log4net.config.xml")
    • El mismo punto que @Tobias he seguido este tutorial: stackify.com/log4net-guide-dotnet-logging, Que configura un log4net.archivo de configuración en AssemblyInfo con la siguiente línea: [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")] vi esta página antes de que vi que ya había publicado este geekswithblogs.net/Lance/archive/2010/08/13/…

  2. 9

    En 2015, lo hacemos así:

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

    Ningún otro código necesario.

    Dominio de la aplicación es la ejecución de la asamblea de nombre de archivo.

  3. 9

    Aquí es la forma de establecer o cambiar el archivo de registro de la primera appender en tiempo de ejecución:

    var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
    appender.File = "C:\whatever.log";
    appender.ActivateOptions();
  4. 4

    a mí me funcionó con la fecha
    <file type="log4net.Util.PatternString" value="./Log/logQueueService%date{yyyy_MM_dd}.log" />

    • Tratar de explicar más claramente por qué esta es una respuesta a la pregunta.

Dejar respuesta

Please enter your comment!
Please enter your name here