Question Log4Net Enregistrement de deux niveaux différents sur deux appenders différents pour le même enregistreur


Nous avons deux applications asp.net différentes avec la journalisation Log4net activée. Ils ont tous deux la même version de Log4Net, 1.2.10.0.

Nous avons ajouté le log4net.Appender.AdoNetAppender enregistreur à tous les deux et que vous souhaitez lui enregistrer le niveau d’information pour l’enregistreur racine, mais également vous connecter au niveau d’erreur d’un enregistreur racine à un appender de fichier. Notre configuration est la suivante:

<?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>  

Le problème que nous constatons est que pour une application, nous voyons des entrées dans la base de données, mais pas pour l'autre.

Revision est GlobalContext propriété dans laquelle nous nous sommes installés Application_Start() dans les deux applications. Et la seule différence entre les deux configurations est que nous avons une valeur différente codée en dur pour Application.

Pouvons-nous avoir deux enregistreurs racine comme celui-ci? Serait-ce la source de notre problème que nous voyons dans une application?


54
2018-01-17 12:45


origine


Réponses:


Vous devriez être capable de définir le threshold propriété de chaque appender séparément et les inclure dans la même racine.

<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>

référence 


93
2018-01-17 14:35



Vous pouvez spécifier un LevelRangeFilter pour chacun des appenders, et définir chaque appender dans la racine pour se connecter à différents niveaux.

<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>

31
2018-01-17 15:21



Deux <root> les éléments ne sont pas autorisés.

De Documentation:

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

Vous pouvez cependant avoir un enregistreur racine comme vous le faites, puis avoir un enregistreur distinct spécifié par un espace de noms.

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

1
2018-01-17 13:05



Utilisez simplement Evaluator, vous n'avez pas besoin de donner de seuil dans tous les appenders.

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

0
2018-02-03 07:04