2017-01-11 10 views
2

Я работаю на приложение, которое регистрирует с помощью SLF4J API:Как сделать java.util.logging отправлять журналы в журнал?

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

... 

private static final Logger LOG = LoggerFactory.getLogger(FreemarkerEmailPreviewGenerator.class); 

... 

LOG.error("Error generating email preview", e); 

(код выше писал, чтобы показать классы и пакеты в использовании, но довольно стандартные вещи.)

Мы используем Logback, выполненный в виде следующим образом:

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

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>[%d{HH:mm:ss.SSS}] [%thread] [%-5level %logger{26} - %msg]%n 
      </pattern> 
     </encoder> 
    </appender> 

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

</configuration> 

Некоторые из нашего кода использует 3-библиотеки сторонних, что журналы с java.util.logging - специально FreeMarker. Как вы можете видеть из следующих записей журнала консоли, как Logback и июль регистрируются на консоль, но они не используют один и те же конфигурации (запись Logback использовать наш шаблон, то они это делают июли не)

[12:24:38.842] [pool-2-thread-19] [INFO u.o.n.r.l.s.e.t.TemplateLoaderFromService - Finding template workflow/mail/templates/common/workflow-macros.ftl] 
[12:24:38.859] [pool-2-thread-19] [INFO u.o.n.r.l.s.e.t.TemplateLoaderFromService - Loaded template workflow/mail/templates/common/workflow-macros.ftl as /workflow/mail/templates/common/workflow-macros.ftl from RegistryMailTemplateService.] 
11-Jan-2017 12:24:38 freemarker.log.JDK14LoggerFactory$JDK14Logger error 
SEVERE: 

Expression domainContact is undefined on line 9, column 74 in workflow/mail/templates/common/workflow-macros.ftl. 
The problematic instruction: 
---------- 
==> ${domainContact.name} [on line 9, column 72 in workflow/mail/templates/common/workflow-macros.ftl] 

Возможно ли, чтобы jul logging использовал конфигурацию logback, чтобы у нас была единственная согласованная конфигурация ведения журнала для всего приложения?

+2

Возможный дубликат [java.util.logging.Logger для ведения журнала с использованием SLF4J?] (http://stackoverflow.com/questions/6020545/java-util-logging-logger -to-logback-using-slf4j) – Berger

ответ

3

Ваше приложение должно иметь следующие банки:

Application -> Freemarker -> java.util.logging -> SLF4J Апи: Юль к slf4j.jar

Применение -> SLF4J API: SLF4J-api.jar

SLF4J API -> Logback: Logback-classic.jar и Logback-core.jar

Поскольку приложение уже содержит SLF4J-api.jar и Logback-classic.jar, вы, вероятно, нужно только добавить июль к slf4j.jar

Если вы используете Maven:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jul-to-slf4j</artifactId> 
    <version>1.7.22</version> 
</dependency> 

<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
    <version>1.1.8</version> 
</dependency> 

Logback классического будет транзитивно добавлять logback-core и slf4j-api

+2

Да, ваш ответ в сочетании со ссылкой на дублированный вопрос помог мне получить эту работу. Мне нужен jul-to-slf4j и включить мост с помощью SLF4JBridgeHandler.removeHandlersForRootLogger(); и SLF4JBridgeHandler.install(); –