web-dev-qa-db-fra.com

Log4Net Plusieurs enregistreurs

Tout d’abord, j’ai vu beaucoup de réponses et de conseils dans d’autres sujets (très similaires: Log4Net: Plusieurs enregistreurs ), mais il n’ya pas de réponse applicable.

Je veux avoir 2 enregistreurs avec différents appender de fichiers et limiter chacun à écrire dans l'enregistreur racine. C'est l'application de la console. Code entier ci-dessous:

using System;
using System.Diagnostics;
using System.Linq;
using log4net;

namespace Test_log4net
{
class Program
{
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();

        ILog logger = LogManager.GetLogger("Async");
        logger.Info("started async");
        Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));


        ILog logger2 = LogManager.GetLogger("Sync");
        logger2.Info("started sync"); //changed: from logger -> to logger2 on 10/21/2014
        Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));

        Console.ReadKey();
    }       
}
}

Et le fichier App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<log4net>
    <root>
        <level value="All"/>
    </root>

    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender">
        <file value="D:\\temp\\AsyncTest.log"/>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG"/>
            <levelMax value="FATAL"/>
        </filter>
        <appendToFile value="true"/>
        <rollingStyle value="Size"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="100MB"/>
        <staticLogFileName value="true"/>
        <datePattern value="yyyyMMdd"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%d - %m%n"/>
        </layout>
    </appender>

    <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender">
        <file value="D:\\temp\\SyncTest.log"/>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG"/>
            <levelMax value="FATAL"/>
        </filter>
        <appendToFile value="true"/>
        <rollingStyle value="Size"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="100MB"/>
        <staticLogFileName value="true"/>
        <datePattern value="yyyyMMdd"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%d - %m%n"/>
        </layout>
    </appender>

    <logger Name="Sync" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="FileInfoAppenderS"/>
    </logger>

    <logger Name="Async" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="FileInfoAppenderA"/>
    </logger>

</log4net>
</configuration>

Et la sortie de la console:

Logger: Async
Appenders: FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderA

Des fichiers ont été créés, mais les deux sont vides. Quand je spécifie des ajouts dans la racine, comme:

<root>
    <level value="All"/>
    <appender-ref ref="FileInfoAppenderA"/>
    <appender-ref ref="FileInfoAppenderS"/>
</root>

alors, console:

log4net:ERROR [RollingFileAppender] Attempted to append to closed appender named [FileInfoAppenderS]
Logger: Async
Appenders: FileInfoAppenderA, FileInfoAppenderS
Logger: Sync
Appenders: FileInfoAppenderA, FileInfoAppenderS

Et uniquement dans AsyncTest.log:

2014-04-11 17:26:58,142 - started async
2014-04-11 17:26:58,151 - started sync

Qu'est ce que je fais mal?

UPD (10/21/2014): Avec la dernière version de log4net disponible via Nuget, la sortie de la console est la suivante:

Logger: Async
Appenders: FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderA

Et les deux fichiers (AsyncTest.log, SyncTest.log) sont vides.

UPD (08/4/2015): La solution consiste à utiliser des minuscules lors de la définition des attributs pour tout dans la section log4net. Donc, j'aurais juste dû changer les lignes suivantes dans app.config:

......
<logger name="Sync" additivity="false">
......
<logger name="Async" additivity="false">
......

Notez la différence: l'attribut 'nom' est en minuscule.

12
LaoR

Vous avez plusieurs fautes de frappe sur votre exemple. La première est que vous ne fermez pas la balise de configuration, et pourquoi vous n’obtenez que dans un fichier, c’est parce que vous appelez:

logger.Info("started async");

et après cela vous faites étonnamment:

logger.Info("started sync");

Vous n'obtiendrez pas d'écriture dans le second fichier car vous ne vous y connectez pas.

Et en console je reçois de votre code:

Logger: Async
Appenders: FileInfoAppenderS, FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderS, FileInfoAppenderA

Pour les informations futures, vous avez correctement défini la valeur additive sur false, car cela signifie que les enregistreurs n’hériteront pas de l’enregistreur racine. En ce qui concerne la déclaration: 

Je veux avoir 2 enregistreurs avec différents appender de fichiers et restreindre chacun à écrire dans l'enregistreur racine

Je ne comprends pas. Si vous souhaitez que vos enregistreurs écrivent dans ces fichiers alors que l'enregistreur racine ayant un appender console, par exemple, supprimez simplement l'additivité et ils écriront dans la console et leurs propres fichiers. Également testé et cela fonctionne très bien.

J'ai lu ton commentaire. Maintenant, j'ajoute le code que j'utilise et j'obtiens ce dont vous avez besoin:

class Program
{
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();

        ILog logger = LogManager.GetLogger("Async");
        logger.Info("started async");
        Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));


        ILog logger2 = LogManager.GetLogger("Sync");
        logger2.Info("started sync");
        Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));

        Console.ReadKey();
    }
}

Et le app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <log4net>
    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender">
      <file value="C:\\temp\\AsyncTest.log"/>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG"/>
        <levelMax value="FATAL"/>
      </filter>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="100MB"/>
      <staticLogFileName value="true"/>
      <datePattern value="yyyyMMdd"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d - %m%n"/>
      </layout>
    </appender>

      <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender">
        <file value="C:\\temp\\SyncTest.log"/>
        <filter type="log4net.Filter.LevelRangeFilter">
          <levelMin value="DEBUG"/>
          <levelMax value="FATAL"/>
        </filter>
        <appendToFile value="true"/>
        <rollingStyle value="Size"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="100MB"/>
        <staticLogFileName value="true"/>
        <datePattern value="yyyyMMdd"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%d - %m%n"/>
        </layout>
      </appender>

    <root>
      <level value="INFO"/>
    </root>

    <logger name="Sync" additivity="false">
      <level value="INFO"/>
      <appender-ref ref="FileInfoAppenderS"/>
    </logger>

    <logger name="Async" additivity="false">
      <level value="INFO"/>
      <appender-ref ref="FileInfoAppenderA"/>
    </logger>
  </log4net>
</configuration>

Version Log4net: 1.2.13.0 avec .NET 4.0 Dites-moi s'il vous plaît si vous obtenez ce que vous voulez.

16
XMight

Cette configuration a fonctionné pour moi:

<log4net>
<root name="EventLog">
<level value="ALL"/>
<appender-ref ref="EventLogAppender"/>
</root>

<logger name="FileLogger" additivity="false">
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />

...appenders
</logger>

Bonne chance!

0
David Castro