2010-03-21 11 views
108

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

Répondre

223

Il est très possible de faire quelque chose comme ça dans le 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> 

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

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

que je dois faire ce genre de chose pour que je puisse avoir un appender sans ligne d'alimentation et un appender régulier dans le même fichier. Merci pour cette info. – djangofan

+0

additivité IMO = false doit être par défaut si l'appender-ref différent est spécifié. Très souvent, nous obtenons une application dans laquelle 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 dans des fichiers différents. Enregistrer le même journal dans 10 fichiers différents n'a vraiment aucun sens. Donc, il devrait être une option opt-in pas par défaut. Étant donné que le logback était une réécriture, la même erreur aurait dû être corrigée par le même auteur. –

+0

Je souhaite enregistrer les messages d'erreur, de débogage et d'information dans différents fichiers, respectivement. Est-il possible avec logback.xml – Qasim

1

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

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

et comme je l'avais peu ces classes, donc mon logbook.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> 
1

Vous pouvez avoir autant d'enregistreurs que vous le souhaitez. Mais, mieux vaut en avoir un pour chaque paquet dont vous avez besoin pour vous connecter différemment. Ensuite, toutes les classes de ce package et ses sous-packages recevront le logger spécifique. Ils peuvent tous partager l'enregistreur racine et envoyer leurs données de journal à l'appendeur de l'enregistreur 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>