65 votes

Comment éliminer les enregistrements en double dans log4net ?

J'ai un programme qui effectue de nombreux appels log4net vers les enregistreurs "myprogram". Il appelle également d'autres codes qui font des appels log4net à d'autres loggers. Je veux capturer tous les journaux supérieurs à INFO pour "monprogramme" et tous les journaux supérieurs à WARN pour tout le reste. De cette façon, je reçois les messages de travail en cours spécifiques à la tâche sur laquelle je travaille, mais je suis toujours informé des choses potentiellement mauvaises qui se produisent dans le code de soutien. Je veux que cela soit envoyé à la fois à Console et à un fichier journal.

J'ai la configuration suivante de log4net :

<log4net>
    <root>
        <level value="WARN" />
        <appender-ref ref="Console" />
        <appender-ref ref="LogFile" />
    </root>
    <logger name="myprogram">
        <level value="INFO" />
        <appender-ref ref="Console" />
        <appender-ref ref="LogFile" />
    </logger>
    <appender name="Console" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message%newline" />
        </layout>
        <threshold value="INFO" />
    </appender>
    <appender name="LogFile" type="log4net.Appender.RollingFileAppender">
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="- %utcdate %level %logger %ndc %thread %message%newline" />
        </layout>
        <appendToFile value="false" />
        <staticLogFileName value="true" />
        <rollingStyle value="Once" />
        <file value="mylogfile" />
        <immediateFlush value="true" />
        <threshold value="INFO" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    </appender>
</log4net>

Cela me semble parfaitement logique : enregistrer >WARN pour tout et >INFO pour l'enregistreur spécifique "myprogram".

Le problème est que je reçois des messages INFO enregistrés. deux fois sur Console et LogFile. Cela ne se produit que si j'ai à la fois le <root> y <logger> Cependant, si je supprime l'un ou l'autre, l'autre fonctionne comme prévu.

Je pourrais comprendre si j'obtenais une double journalisation des entrées WARN (puisque myprogram correspond à la fois à "Root" et à "myprogram"), mais cela se produit à INFO même si Root est (vraisemblablement) défini à WARN.

Est-ce que je fais quelque chose de mal ici, ou est-ce un bug/ambiguïté de log4net ?

83voto

Vous obtenez des doublons parce que vous lui demandez d'enregistrer les messages deux fois. Je ne recommanderais pas d'utiliser l'additivité ici, car vous pourriez ressentir des effets secondaires, il suffit de supprimer la configuration inutile :

<root>
    <level value="WARN" />
    <appender-ref ref="Console" />
    <appender-ref ref="LogFile" />
</root>
<logger name="myprogram">
    <level value="INFO" />
</logger>

Vous n'avez pas besoin d'indiquer les appender-ref dans le logger myprogram puisqu'il les héritera du logger Root ; si vous les indiquez à nouveau, il enregistrera deux fois.

72voto

Eddie Points 27755

Essayez avec ce changement, en mettant l'additivité à faux.

<root>
    <level value="WARN" />
    <appender-ref ref="Console" />
    <appender-ref ref="LogFile" />
</root>
<logger name="myprogram" additivity="false">
    <level value="INFO" />
    <appender-ref ref="Console" />
    <appender-ref ref="LogFile" />
</logger>

2 votes

C'est un bon moyen de s'assurer que tous les messages enregistrés dans le journal "myprogram" n'atteignent pas le journal "Root".

0 votes

Cela fonctionne pour moi ; je veux que toutes les entrées de journal d'une classe particulière aillent dans un appender différent des autres classes.

0 votes

@jaminator : C'est une question difficile à répondre dans l'espace d'un commentaire, et je ne suis pas tout à fait sûr de ce que vous demandez. Demandez-vous pourquoi vous pourriez configurer quelque chose comme ça ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X