web-dev-qa-db-fra.com

Comment configurer log4j à l'aide de log4j.xml pour l'ajouter à différents fichiers journaux en fonction du nom de la classe?

Je veux configurer log4j pour que tous les messages de journal produits à partir des classes sous le package com.foo.bar vont à bar.log, et tous les messages de journal produits à partir des classes sous le paquet com.bar.blatz vont à blatz.log.

Des questions

  • Comment faire cela en utilisant log4j.xml?
  • Je sais qu'il est possible d'utiliser des fichiers de propriétés, mais comment puis-je le faire en utilisant la configuration XML?
27
benhsu

Ceci est basé sur mon réponse à une question similaire:

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/">
    <!-- general application log -->
    <appender name="BarLogFile" class="org.Apache.log4j.FileAppender">
        <param name="File" value="bar.log" />
        <param name="Threshold" value="INFO" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
        </layout>
    </appender> 

    <!-- additional fooSystem logging -->
    <appender name="BlatzLogFile" class="org.Apache.log4j.FileAppender">
        <param name="File" value="blatz.log" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
        </layout>
    </appender>

    <logger name="com.foo.bar">
        <appender-ref ref="BarLogFile"/>
    </logger>

    <logger name="com.bar.blatz">
        <appender-ref ref="BlatzLogFile"/>
    </logger>

    <root>
        <level value="INFO"/>
        <!-- no appender, output will be swallowed (I think) -->
    </root>
</log4j:configuration>

Si vous ajoutez un appender-ref à l'élément racine, il recevra également des messages com.foo.bar, etc. Vous pouvez arrêter cela en spécifiant 'additivity = "false"' sur les enregistreurs.

39
araqnid