25

¡He buscado duplicados pero tengo que preguntar lo siguiente, no importa cuán simple parezca, para aclararlo de una vez por todas!inicialización de log4net

En una aplicación nueva consola usando log4net versión 1.2.10.0 en VS28KSP1 de 64 bits 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, que 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 agregue un atributo:

[ assembly:XmlConfigurator ] 

O explícitamente en itialise que 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 he visto trabajar en alguna parte de alguna versión de log4net sin la adición del atributo ensamblaje o llame a Main. ¿Alguien me puede asegurar que no estoy imaginando eso?
  2. ¿Puede alguien indicarme en qué lugar del documento se indica explícitamente que se requieren tanto la sección de configuración como el enlace de inicialización, con suerte con una explicación de cuándo esto cambió, si fue así?

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 este no siempre es el caso ... (Y normalmente tengo la configuración en un archivo separado, que generalmente toma configSections fuera de la imagen)

Respuesta

27

Según the configuration page in the manual:

la configuración log4net se puede configurar mediante ensamblaje de nivel atributos en lugar de especificado mediante programación.

XmlConfiguratorAttribute: El log4net.Config.XmlConfiguratorAttribute Permite al XmlConfigurator a configurarse usando las siguientes propiedades:

  • ConfigFile ...
  • ConfigFileExtension ...

Si ninguno de los ConfigFile o propiedades ConfigFileExtension se especifican, el archivo de configuración de la aplicación (por ejemplo, TestApp.exe.config) se utilizará como el archivo de configuración de 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 que es un poco ambigua, pero interpreto la existencia del ejemplo de uso para significar que log4net no va a utilizar el archivo .config sin el atributo anterior; y el hecho de que señalan que debe usar una de las dos propiedades, pero no dice nada acerca de omitir el atributo por completo, me sugiere que el atributo (o llamada programática) es necesario para usar app.config en el forma en que quieres

+0

Todo suena muy plausible.Todavía estoy buscando más: estoy convencido de que he visto cosas emitidas en un archivo de registro sin una llamada explícita XmlConfiguratorAttribute o XmlConfigurator.Configure. Parece razonablemente consistente que wrt no funcione en 1.2.10, y el código a través de Reflector no sugiere que haya ninguna razón por la que funcionaría sin el marcador o la invocación explícita. Tal vez debería usar NLog en su lugar, y no habría ninguno de estos problemas: P –

+1

@Ruben - ¿Por qué cambiar a un marco diferente solo porque tiene que inicializar log4net? –

+1

@Peter Lillevold: No tengo esa intención, no estoy seguro de dónde surgió la idea. Solo me interesa entender cómo alguna vez llegué a pensar que es posible que funcione sin algún tipo de configuración explícita, ya sea a través del atributo o una llamada al configurador. ¿Configurar ...? –