Connectez-vous pour enregistrer différents messages dans deux fichiers


147

J'utilise logback / slf4j pour faire ma journalisation. Je veux analyser mon fichier journal pour analyser certaines données, donc au lieu d'analyser un très gros fichier (principalement composé d'instructions de débogage), je veux avoir deux instances de journalisation qui enregistrent chacune dans un fichier séparé; un pour l'analyse et un pour la journalisation polyvalente. Est-ce que quelqu'un sait si cela est possible avec Logback, ou tout autre enregistreur d'ailleurs?

Réponses:


297

Il est très possible de faire quelque chose comme ça dans logback. Voici un exemple de configuration:

<?xml version="1.0"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
        <file>analytics.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- additivity=false ensures analytics data only goes to the analytics log -->
    <logger name="analytics" level="DEBUG" additivity="false">
        <appender-ref ref="ANALYTICS-FILE"/>
    </logger>
    <root>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

Ensuite, vous configurez deux enregistreurs distincts, un pour tout et un pour enregistrer les données d'analyse comme ceci:

Logger analytics = LoggerFactory.getLogger("analytics");

1
Je dois faire ce genre de chose pour pouvoir avoir un appender sans ligne et un appender régulier dans le même fichier. Merci pour cette information.
djangofan

IMO additivity = false doit être la valeur par défaut si un autre appender-ref est spécifié. Très fréquemment, nous obtenons des applications dans lesquelles certains modules seront des générateurs de journaux très fréquents en raison de certains événements de minuterie, et nous aimerions séparer ces journaux en différents fichiers. Enregistrer le même journal dans 10 fichiers différents n'a vraiment aucun sens. Il devrait donc s'agir d'une fonctionnalité optionnelle et non par défaut. Puisque le logback était une réécriture, la même erreur aurait dû être corrigée par le même auteur.
samarjit samanta

Je veux enregistrer les messages d'erreur, de débogage et d'informations dans différents fichiers respectivement. Est-ce possible avec logback.xml
Qasim


J'essaie de consigner les journaux de différents packages vers différents fichiers comme le suggère cette réponse, mais cela ne fonctionne pas pour moi. Mon extrait xml logback est ici - pastebin.com/Aii4f1Jk . J'essaie d'enregistrer les journaux de niveau TRACE du package d'hibernation dans un fichier différent. Aucune suggestion?
Andy Dufresne

7

Vous pouvez avoir autant d'enregistreurs que vous le souhaitez. Mais il est préférable d'en avoir un pour chaque paquet dont vous avez besoin pour vous connecter différemment. Ensuite, toutes les classes de ce package et de ses sous-packages recevront ce journal spécifique. Ils peuvent tous partager l'enregistreur racine et envoyer leurs données de journal à l'appender d'enregistrement racine en utilisant additivity = "true". Voici un exemple:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern>
    </encoder>
</appender>

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/worker.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/transformer.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true">
    <appender-ref ref="xyz"/>
</logger>

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true">
    <appender-ref ref="abc"/>
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
</root>


2

dans mon cas, je voulais laisser les noms de classe comme nom de journal

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);

et comme j'avais peu de cours de ce genre, mon logback.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more -->
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.