.net log4net initialization log4net-configuration xmlconfigurator

.net - log4net configuration c#



inicializacion log4net (1)

He buscado los duplicados pero tengo que preguntar lo siguiente, no importa lo básico que parezca, ¡para que quede claro de una vez por todas!

En una aplicación de consola nueva que usa log4net versión 1.2.10.0 en VS28KSP1 en 64 bit W7, tengo el siguiente código:

using log4net; using log4net.Config; namespace ConsoleApplication1 { class Program { static readonly ILog _log = LogManager.GetLogger(typeof(Program)); static void Main(string[] args) { _log.Info("Ran"); } } }

En mi app.config , tengo:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Program.log" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="1MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%username] %date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="RollingFileAppender" /> </root> </log4net> </configuration>

Esto no escribe nada, a menos que yo agregue un atributo:

[ assembly:XmlConfigurator ]

O explícitamente inicializarlo en Main ():

_log.Info("This will not go to the log"); XmlConfigurator.Configure(); _log.Info("Ran");

Esto plantea las siguientes preguntas:

  1. Estoy casi seguro de que lo he visto trabajar en algún lugar en alguna versión de log4net sin agregar el atributo de ensamblado o la llamada en Main. ¿Puede alguien asegurarme que no estoy imaginando eso?
  2. ¿Alguien puede indicarme dónde en el documento indica explícitamente que tanto la sección de configuración como el enlace de inicialización son necesarios, con suerte con una explicación de cuándo cambió esto, si lo hizo?

Puedo imaginar fácilmente por qué esta podría ser la política: tener el paso de inicialización explícito para evitar sorpresas, etc., es solo que parece recordar que no siempre es así ... (Y normalmente tengo la configuración en un archivo separado , que generalmente saca configsections de la imagen)


De acuerdo a la página de configuración en el manual :

La configuración de log4net se puede configurar utilizando atributos de nivel de ensamblaje en lugar de especificarse mediante programación.

XmlConfiguratorAttribute: log4net.Config.XmlConfiguratorAttribute Permite que XmlConfigurator se configure utilizando las siguientes propiedades:

  • Archivo de configuración ...
  • ConfigFileExtension ...

Si no se especifica ninguna de las propiedades ConfigFile o ConfigFileExtension, el archivo de configuración de la aplicación (por ejemplo, TestApp.exe.config) se utilizará como el archivo de configuración log4net.

Ejemplo de uso:

// Configure log4net using the .config file [assembly: log4net.Config.XmlConfigurator(Watch=true)] // This will cause log4net to look for a configuration file // called TestApp.exe.config in the application base // directory (i.e. the directory containing TestApp.exe) // The config file will be watched for changes.

Estoy de acuerdo en que es un poco ambiguo, pero interpreto que la existencia del uso del ejemplo significa que log4net no usará el archivo .config sin el atributo anterior; y el hecho de que indiquen que tiene que usar una de las dos propiedades, pero no dice nada sobre omitir el atributo por completo, me sugiere que el atributo (o llamada programática) es necesario para usar app.config en el como tu quieras