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?

Aly
la source

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");
ig0774
la source
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
@Qasim - c'est possible. Voir - amitstechblog.wordpress.com/2014/09/27/…
Andy Dufresne
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>

Un rat
la source
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>
panser
la source