¡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:
- 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?
- ¿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)
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 –
@Ruben - ¿Por qué cambiar a un marco diferente solo porque tiene que inicializar log4net? –
@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 ...? –