tutorial logmanager getlogger español c# asp.net logging log4net

c# - logmanager - log4net tutorial español



Log4Net Logging de dos niveles diferentes a dos apéndices diferentes para el mismo registrador (4)

Tenemos dos aplicaciones asp.net diferentes con log4net logging habilitado. Ambos tienen la misma versión de Log4Net, 1.2.10.0.

Hemos agregado el registrador log4net.Appender.AdoNetAppender a ambos y queremos registrar el nivel de información para el registrador de raíz, pero también queremos registrar el nivel de error para un registrador de raíz en un appender de archivos. Nuestra configuración es la siguiente;

<?xml version="1.0" encoding="utf-8"?> <log4net> <appender name="filelogAppender" type="log4net.Appender.RollingFileAppender" > <file value="../logs/app.debug.log" /> <encoding value="utf-8" /> <staticLogFileName value="true" /> <datePattern value=".yyyyMMdd.''log''" /> <rollingStyle value="Composite" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <appendToFile value="true" /> <maximumFileSize value="1MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%3thread] %-5level %property{log4net:HostName} [%property{Revision}] %logger %message%n" /> </layout> </appender> <!-- use [DB] GO CREATE TABLE [dbo].[Log] ( [Id] [int] IDENTITY (1, 1) NOT NULL, [Date] [datetime] NOT NULL, [Application][varchar] (255) NOT NULL, [Thread] [varchar] (255) NOT NULL, [Level] [varchar] (50) NOT NULL, [Logger] [varchar] (255) NOT NULL, [Server][varchar](255) NOT NULL, [Revision][varchar](50) NOT NULL, [Message] [varchar] (4000) NOT NULL, [Exception] [varchar] (2000) NULL ) --> <appender name="dbLogAppender" type="log4net.Appender.AdoNetAppender" xdt:Transform="InsertBefore(/log4net/root)"> <bufferSize value="100" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="data source=sqlserver;initial catalog=DB;integrated security=false;persist security info=True;User ID=USER;Password=PASSWORD" /> <commandText value="INSERT INTO Log ([Date],[Application],[Thread],[Level],[Logger],[Server],[Revision],[Message],[Exception]) VALUES (@log_date,''WebApp1'', @thread, @log_level, @logger, @server, @revision, @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="@server" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{log4net:HostName}"/> </layout> </parameter> <parameter> <parameterName value="@revision" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{Revision}"/> </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> <root> <level value="Error"/> <appender-ref ref="filelogAppender"/> </root> <root> <level value="Info"/> <appender-ref ref="dbLogAppender"/> </root> </log4net>

El problema que estamos viendo es que para una aplicación vemos entradas en la base de datos, pero para la otra no lo hacemos.

Revision es la propiedad GlobalContext que configuramos en Application_Start() en ambas aplicaciones. Y la única diferencia entre las dos configuraciones es que tenemos un valor diferente codificado para la Application .

¿Podemos tener dos registradores de raíz como este? ¿Podría ser esta la fuente de nuestro problema que estamos viendo en una sola aplicación?


Debería poder establecer la propiedad de threshold de cada apéndice por separado e incluirlos en la misma raíz.

<appender name="filelogAppender" type="log4net.Appender.RollingFileAppender"> <threshold value="Error" /> </appender> <appender name="dblogAppender" type="log4net.Appender.AdoNetAppender"> <threshold value="Info" /> </appender> <root> <appender-ref ref="filelogAppender" /> <appender-ref ref="dblogAppender" /> </root>

reference


Dos elementos <root> no están permitidos.

De la documentation :

root Optional element, maximum of one allowed. Defines the configuration of the root logger.

Sin embargo, puede tener un registrador de raíz como usted, y luego tener un registrador separado especificado por un espacio de nombres.

<root> <level value="Error"/> <appender-ref ref="filelogAppender"/> </root> <logger name="MyCompany.MyApp.Namespace"> <level value="Info"/> <appender-ref ref="dbLogAppender"/> </logger>


Puede especificar un LevelRangeFilter para cada uno de los appenders y definir cada appender en la raíz para iniciar sesión en diferentes niveles.

<appender name="filelogAppender" type="log4net.Appender.RollingFileAppender" > <!--File Details/Layout Options--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO"/> </filter> </appender> <appender name="dbLogAppender" type="log4net.Appender.AdoNetAppender"> <!--SQL Options--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR"/> </filter> </appender> <root> <level value="INFO"/> <appender-ref ref="filelogAppender" /> <!--Prints info, warn, error, or fatal logs. --> <appender-ref ref="dbLogAppender" /> <!--Prints only error or fatal logs. --> </root>


Simplemente use Evaluator, no necesita dar el umbral en todos los appenders.

<appender name="filelogAppender" type="log4net.Appender.RollingFileAppender"> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="ERROR" /> </evaluator> </appender>