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 и т. Д. Тоже не созданы, поэтому что-то явно настроено, но не то, что я ожидаю.
Кто-нибудь может увидеть, что я делаю не так? Есть ли лучший подход, чем тот, который я пробую?
Спасибо!