Статьи

Заставить Tomcat войти через SLF4J / Logback

Итак, у вас есть исполняемое веб-приложение в JAR с Tomcat (обязательно прочитайте его сначала). Однако вначале есть эти раздражающие журналы Tomcat, независимые от журналов нашего приложения и не настраиваемые:

1
2
3
4
5
6
7
8
Nov 24, 2012 11:44:02 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Nov 24, 2012 11:44:02 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Nov 24, 2012 11:44:02 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.30
Nov 24, 2012 11:44:05 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]

Я бы очень хотел их убить, или даже лучше сохранить их где-нибудь, поскольку они иногда обнаруживают важные сбои. Но я определенно не хочу иметь отдельную конфигурацию java.util.logging . Задумывались ли вы после прочтения предыдущей статьи, откуда я узнал, что работающий JAR Tomcat поддерживает параметр httpPort и некоторые другие? Ну, я проверил источники, но проще просто попросить помощи:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ java -jar target/standalone.jar -help
usage: java -jar [path to your exec war jar]
-ajpPort <ajpPort> ajp port to use
-clientAuth enable client authentication for
https
-D <arg> key=value
-extractDirectory <extractDirectory> path to extract war content,
default value: .extract
-h,--help help
-httpPort <httpPort> http port to use
-httpProtocol <httpProtocol> http protocol to use: HTTP/1.1 or
org.apache.coyote.http11.Http11Nio
Protocol
-httpsPort <httpsPort> https port to use
-keyAlias <keyAlias> alias from keystore for ssl
-loggerName <loggerName> logger to use: slf4j to use slf4j
bridge on top of jul
-obfuscate <password> obfuscate the password and exit
-resetExtract clean previous extract directory
-serverXmlPath <serverXmlPath> server.xml to use, optional
-uriEncoding <uriEncoding> connector uriEncoding default
ISO-8859-1
-X,--debug debug

Параметр -loggerName выглядит многообещающе. Первая попытка:

1
2
$ java -jar target/standalone.jar -loggerName slf4j
WARNING: issue configuring slf4j jul bridge, skip it

Не хорошо. Беглый взгляд на исходный код еще раз, и получается, что библиотека SLF4J отсутствует. Поскольку этот параметр интерпретируется во время начальной загрузки Tomcat (перед развертыванием веб-приложения), slf4j-api.jar внутри моего веб-приложения недостаточно, он должен быть доступен для загрузчика корневых классов (эквивалентно каталогу / lib в упакованном Tomcat). К счастью, плагин предоставляет параметр конфигурации <extraDependencies /> :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<configuration>
    <path>/standalone</path>
    <enableNaming>false</enableNaming>
    <finalName>standalone.jar</finalName>
    <charset>utf-8</charset>
    <extraDependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.0.7</version>
        </dependency>
    </extraDependencies>
</configuration>

Запуск Tomcat и … успехов!

1
2
3
4
00:01:27.110 [main] INFO o.a.coyote.http11.Http11Protocol - Initializing ProtocolHandler ["http-bio-8080"]
00:01:27.127 [main] INFO o.a.catalina.core.StandardService - Starting service Tomcat
00:01:27.128 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet Engine: Apache Tomcat/7.0.33
00:01:29.645 [main] INFO o.a.coyote.http11.Http11Protocol - Starting ProtocolHandler ["http-bio-8080"]

Ну, не совсем. Если вы используете Logback ежедневно, вы знакомы с шаблоном регистрации консоли по умолчанию. Мы не logback.xml никакой logback.xml . Исходя из моего опыта, кажется, что размещение logback.xml где-то в вашей файловой системе лучше, чем размещение его в вашем бинарном файле, особенно с включенной функцией автоматического обновления:

1
2
3
<configuration scan="true" scanPeriod="5 seconds">
<!-- ... -->
</configuration>

Поместите какой-нибудь резервный файл logback.xml в корень вашего CLASSPATH на тот случай, если другой файл не был указан, как показано ниже, и вуаля:

1
2
$ java -jar standalone.jar -httpPort=8081 -loggerName=slf4j \
-Dlogback.configurationFile=/etc/foo/logback.xml

Наконец, чистая и согласованная регистрация, скорее всего, для одного файла.

Ссылка: принуждение Tomcat войти через SLF4J / Logback от нашего партнера по JCG Томаша Нуркевича в блоге на Java и соседях .