SLF4JBridgeHandler с Tomee 7.0.1 для вывода журналов Tomcat с Logback

Я пытаюсь использовать SLF4JBridgeHandler и jul-to-slf4j, чтобы я мог получить журналы Tomcat в формате JSON, используя кодировщик Logback Logstash. Мы уже внедряем наши приложения, чтобы использовать этот кодер для получения журналов наших приложений в формате JSON, и теперь мы хотели бы сделать то же самое для журналов контейнеров, журналов доступа и т. Д.... Мы пытаемся сделать это для Tomee Развертывания 7.0.1 (Tomee 7.1 развертывает Tomcat 8.5.3).

В попытке настроить это, я скопировал эти банки в эти места:

$CATALINA_HOME/bin/jul-to-slf4j-1.7.25.jar
$CATALINA_HOME/bin/slf4j-api-1.7.25.jar
$CATALINA_HOME/bin/logback-classic-1.2.3.jar
$CATALINA_HOME/bin/logback-core-1.2.3.jar
$CATALINA_HOME/bin/logstash-logback-encoder-5.2.jar

Я создаю $CATALINA_HOME/bin/setenv.sh, чтобы в CLASSPATH содержались новые файлы jar и каталог, в котором находится конфигурация logback.xml.

CLASSPATH=$CATALINA_HOME/bin/jul-to-slf4j-1.7.25.jar:$CATALINA_HOME/bin/slf4j-api-1.7.25.jar:$CATALINA_HOME/bin/logback-classic-1.2.3.jar:$CATALINA_HOME/bin/logback-core-1.2.3.jar:$CATALINA_HOME/bin/logstash-logback-encoder-5.2.jar:$CATALINA_HOME/bin/logback-config

Я скопировал файл logging.properties в $CATALINA_HOME/conf/logging.properties одной строкой

handlers = org.slf4j.bridge.SLF4JBridgeHandler

... и, наконец, я создал упрощенный logback.xml

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>/usr/local/tomcat/logs/my.log</file>
    <encoder>
      <Pattern>%d{HH:mm} [%thread] %-5level %logger{36} - %msg%n</Pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="FILE" />
  </root>
</configuration>

Когда я пытаюсь вызвать Tomcat, происходит сбой с этой ошибкой

19:47:12.548 [localhost-startStop-1] ERROR org.apache.catalina.core.ContainerBase - ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/docs]]
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:158)
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702)
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1107)
     at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1841)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
     at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContainerInitializer
     at java.lang.ClassLoader.defineClass1(Native Method)
     at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
     at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     at java.lang.Class.forName0(Native Method)
     at java.lang.Class.forName(Class.java:348)
     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1268)
     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1116)
     at java.lang.Class.forName0(Native Method)
     at java.lang.Class.forName(Class.java:348)
     at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:188)
     at org.apache.catalina.startup.WebappServiceLoader.load(WebappServiceLoader.java:159)
     at org.apache.catalina.startup.ContextConfig.processServletContainerInitializers(ContextConfig.java:1611)
     at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1131)
     at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:771)
     at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:298)
     at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5076)
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
     ... 10 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContainerInitializer
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     ... 38 common frames omitted

Насколько я понимаю, ошибка связана с более старой версией сервлет-API где-то на пути к классам. Если я регрессирую версии logback до 1.1.9 (вместо 1.2.3), я больше не получаю никаких ошибок, и Tomcat запускается должным образом... однако, не похоже, что мой logback.xml соблюдается, поскольку я не вижу мой ожидаемый файл журнала создается. Типичный файл catalina.log и т. Д. Тоже не созданы, поэтому что-то явно настроено, но не то, что я ожидаю.

Кто-нибудь может увидеть, что я делаю не так? Есть ли лучший подход, чем тот, который я пробую?

Спасибо!

0 ответов

Другие вопросы по тегам