c# - ejemplo - log4net levels
¿Por qué todos mis niveles de log4net son falsos? (12)
Estoy usando log4net en mi proyecto ASP.NET MVC3, pero todas las propiedades de registro como IsDebugEnabled
== false
En mi AssemblyInfo tengo:
[assembly: XmlConfigurator(Watch = true)]
En mi clase de registro tengo
public Log4NetLogger()
{
log4net.Config.XmlConfigurator.Configure();
Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
Mis cosas de configuración relacionadas en Web.Config son:
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=152368
-->
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
</sectionGroup>
</configSections>
<log4net debug="false">
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="{removed}" />
<commandText value="INSERT INTO Logging ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!--Possible levels:-->
<!--DEBUG-->
<!--INFO-->
<!--WARN-->
<!--ERROR-->
<!--FATAL-->
<root>
<level value="All" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
</applicationSettings>
</configuration>
Ya me frustré al punto de querer hacerlo
public Log4NetLogger()
{
Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Logger.IsDebugEnabled = true;
}
Sin embargo, por supuesto, Logger.IsDebugEnabled
no tiene ningún configurador: /
¿Qué tengo que hacer para que funcione esta maldita cosa?
Cambie su línea a siguiente en AssemblyInfo.cs
:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
y poner la configuración de log4net en ese archivo.
Cambie su línea a siguiente en AssemblyInfo.cs:
[ensamblaje: log4net.Config.XmlConfigurator (Watch = true)]
Asegúrese de agregar log4net dll y también coloque la configuración de log4net en el archivo web.config como
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" />
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:/LOGS/IDMUserRoleManagement/IDMUserRoleManagement.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="1000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{yyyy-MM-ddTHH:mm:ss} %-5p [%t] - %m%n" />
</layout>
</appender>
</log4net>
</configuration>
Deberías haber fallado al inicializar log4net en tu aplicación. Esto se puede inicializar explícitamente colocando a continuación en ''Application_Start'',
log4net.Config.XmlConfigurator.Configure ();
En mi caso, esto se debió al hecho de que <configSections>
no fue la primera etiqueta de la sección <configuration>
. Esto evita que el nombre de la sección log4net sea reconocido. Por lo tanto, la instancia de registro muestra el IsDebugEnabled y todos los demás como booleano falso predeterminado.
Esto debería ser así.
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<configuration>
He tenido este mismo problema. Lo resuelvo usando la línea de código que se encuentra a continuación en el método Application_Start
en Global.asax.cs (asumiendo que es una aplicación web .Net)
log4net.Config.XmlConfigurator.Configure();
Log4net espera que su sección de configuración no sea agrupada. Porque en su configuración, ha puesto su sección log4net dentro de un ApplicationSettingsGroup (applicationSettings)
log4net no encontrará su configuración. Puede mover la sección log4net fuera del grupo o puede especificar el grupo al llamar a XmlConfigurator.Configure
:
XmlConfigurator.Configure(
ConfigurationManager.GetSection(
"applicationSettings/log4net") as XmlElement);
Los niveles de registro distinguen entre mayúsculas y minúsculas, así que en lugar de:
<level value="All" />
debiera ser
<level value="ALL" />
También me resulta mucho más fácil crear un archivo de configuración log4net separado. Cree un archivo llamado log4net.config y establezca la propiedad Copiar en el directorio de salida para Copiar siempre (copiando su configuración de App.config en este archivo)
Luego, al configurar el uso de configuración:
XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
No hay configurador para IsDebugEnabled ya que es de solo lectura ..
Utilice log4net.Config.XmlConfigurator.Configure (); en cualquier método antes de usar log
y en app.Config la configuración debe ser:
<root>
<level value="ALL" />
<appender-ref ref="AppenderName" />
</root>
Nunca he visto <level value="All" />
antes, por lo general solo establezco un value
en uno de los niveles (ya que incluyen los niveles por encima de ellos o por debajo de ellos a medida que los tiene en su configuración, en la pila de nivel). Algo como esto:
<level value="DEBUG" />
También puede intentar probarlo con un registrador explícito, solo para ver si el problema puede ser otra cosa. Algo simple adyacente al (a los) nodo (s) del appender
como este:
<logger name="Log4NetTEST" >
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</logger>
Luego, al probarlo en su código, crearía el registrador de esta manera:
LogManager.GetLogger("Log4NetTEST");
Parece que perdió los cambios de configuración de la propiedad del archivo de configuración Copiar al directorio de salida = "Copiar siempre" Consulte esta imagen de configuración para obtener más detalles. Propiedades de configuración de archivo de configuración
Si el archivo de registro de clase (Log4NetLogger) está en una sola biblioteca de clases, entonces el código: [assembly: log4net.Config.XmlConfigurator (C .... debería estar en la misma biblioteca de clases.
por ejemplo: lib 1: my.web (un proyecto mvc) lib 2: my.common (un proyecto de biblioteca de clases)
si envuelve el código logmanager en my.common, entonces "[assembly: log4net.Config.XmlConfigurator (C ..." DEBE ESTAR EN my.common, si lo pone en my.web, ¡no funcionará!
Editar:
El uso de todos los archivos de configuración (app.config, web.config, log4net.config, etc.) se basa en el contexto. Entonces, si tiene una aplicación que llama a una biblioteca de clases, el archivo de configuración que se utilizará es .Config en el proyecto de la aplicación, no la biblioteca de clases.
Otro ejemplo, si está probando una aplicación, el contexto es el proyecto de prueba de unidad y ese es el archivo de configuración que se usará, no la configuración de la aplicación.
Te estás perdiendo la etiqueta de apertura para la configuración de la applicationSettings
. Esa podría ser la causa