Cómo crear 2 loggers RAÍZ diferentes con logback?


Estoy felizmente usando SLF4J con logback y uso 2 appenders para el logger ROOT.

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>

¿Cómo podríamos tener diferentes niveles de registro para ambos appenders? Todavía necesito todos los mensajes de ROOT-logger.

  • DEBUG -nivel para STDOUT
  • INFO -nivel para el ARCHIVO

Todos los registros deben ser parte de la salida (por lo que se necesita el logger RAÍZ).

Author: TylerH, 2013-09-16

2 answers

Nunca tendrá más de un registrador raíz, por lo que su pregunta es un poco engañosa. Lo que está buscando es cómo afinar qué eventos registra cada uno de los agregadores.

Y para ello, se añade un filtro umbral a cada uno de los anexos:

Http://logback.qos.ch/manual/filters.html#thresholdFilter

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  <level>INFO</level>
</filter>

Configure la INFORMACIÓN de nivel para el ARCHIVO-appender y DEPURE para STDOUT.

Editar: Tengo que disputar el cargo de la otra respuesta de que esta está mal: Sí, puede tener más de un elemento root- en la configuración. Eso no crea más de un root - logger sin embargo, que es lo que pide el título de la pregunta. Además, el manual de logback indica en http://logback.qos.ch/manual/configuration.html#syntax (destacando el mío):

Sin embargo, la estructura básica del archivo de configuración puede ser descrito como, elemento, seguido de cero o más elements, seguido de cero o más elementos , seguido de como máximo un elemento .

Podría funcionar, pero al menos va en contra de las convenciones.

 46
Author: sheltem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-24 08:30:19

La respuesta anterior es incorrecta: puede tener múltiples elementos root, cada uno con un registro asociado level y un appender-ref (estoy trabajando con logback.versión>1.0.13) En este caso también tienes que poner un FILTRO dentro de tus appenders, así:

<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
    <resetJUL>true</resetJUL>
</contextListener>

<!-- To enable JMX Management -->
<jmxConfigurator/>

<appender name="console-info" class="ch.qos.logback.core.ConsoleAppender">
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
     <level>INFO</level>
     <onMatch>ACCEPT</onMatch>
     <onMismatch>DENY</onMismatch>
  </filter>
  <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
  </encoder>
</appender>  

<appender name="console-debug" class="ch.qos.logback.core.ConsoleAppender">
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
     <level>DEBUG</level>
     <onMatch>ACCEPT</onMatch>
     <onMismatch>DENY</onMismatch>
  </filter>
  <encoder>
      <pattern>[%d{ddMMMyyyy HH:mm:ss.SS}]%-5level %logger{45} - %msg %n</pattern>
  </encoder>
</appender>


<root level="info">
    <appender-ref ref="console-info"/>
</root>
<root level="debug">
    <appender-ref ref="console-debug"/>
</root>

 5
Author: m.piunti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-29 11:38:02