Logback Logstash Tomcat访问JSON日志。

问题描述 投票:0回答:1

有人用Logstas Logback Encoder把Tomcat的访问日志转换成JSON格式吗?

尽管这应该是可能的(根据文档),但我不能让它工作,我一直在Tomcat的classpath地狱中挣扎。Tomcat正在抛出NoClassDefFoundErrors,即使我100%确定类必须存在于classpath上。这根本没有任何意义......。

我把所有需要的JAR都放到了Tomcats中。lib/ 目录,将它们添加到classpath中,并设置了所有需要的配置文件(按照多个官方和非官方教程)。

Tomcat的日志(catalina.out -> catalina.json)在Logstash Logback Encoder下工作得很好,但Tomcat的访问日志是一个完全不同的问题......。

无论我尝试了什么,每次都会出现这样的结果。

NoClassDefFoundError: javax/servlet/ServletContainerInitializer

NoClassDefFoundError: org/apache/catalina/Lifecycle

ClassNotFoundException: ch.qos.logback.access.spi.IAccessEvent

通过binsetenv.sh将logback-access.jar(除了所有其他logbackslf4jlogstash JARs)添加到Classpath中,破坏了整个classpath(崩溃循环与 NoClassDefFoundError: org/apache/catalina/Lifecycle). 在没有logback-access.jar的情况下,添加所有其他logbackslf4jlogstash JARs都能正常工作(但后来的结果是 ClassNotFoundException: ch.qos.logback.access.spi.IAccessEvent 但Tomcat在没有写入Access Logs的情况下运行良好)......

我甚至不能提供我的当前状态,因为我不知道什么是最 "正确 "的状态,也就是最接近解决方案的状态......。

如果有人得到了Tomcat的访问日志为JSON,请告诉我如何(即使你使用不同的编码器)。

已经花费了我好几天的时间去搜索,试错和我所有的神经......

更新

这里证明Tomcat的Classpath或ClassLoading是非常****的,没有任何意义(启动JVM时用 -verbose:class), catalina.out 产量。

[Loaded ch.qos.logback.access.spi.IAccessEvent from file:/home/tomcat/tomcat_8.5.34/lib/logback-access-1.2.0.jar]

...

java.lang.ClassNotFoundException: ch.qos.logback.access.spi.IAccessEvent

...

该类必须在另一个上下文ClasspathClassLoader中加载... ... 我不知道这是如何工作的......

tomcat logback slf4j logstash-logback-encoder jul-to-slf4j
1个回答
0
投票

我能够使用以下过程获得JSON格式的Tomcat访问日志。

1) 下载并解压tomcat

curl -LO https://downloads.apache.org/tomcat/tomcat-8/v8.5.54/bin/apache-tomcat-8.5.54.tar.gz
tar xvzf apache-tomcat-8.5.54.tar.gz
cd apache-tomcat-8.5.54

2) 将所需的依赖项安装到tomcat的lib目录下。

mvn dependency:copy -Dartifact=net.logstash.logback:logstash-logback-encoder:6.3 -DoutputDirectory=lib
mvn dependency:copy -Dartifact=ch.qos.logback:logback-access:1.2.3 -DoutputDirectory=lib
mvn dependency:copy -Dartifact=ch.qos.logback:logback-core:1.2.3 -DoutputDirectory=lib
mvn dependency:copy -Dartifact=com.fasterxml.jackson.core:jackson-databind:2.10.0 -DoutputDirectory=lib
mvn dependency:copy -Dartifact=com.fasterxml.jackson.core:jackson-core:2.10.0 -DoutputDirectory=lib
mvn dependency:copy -Dartifact=com.fasterxml.jackson.core:jackson-annotations:2.10.0 -DoutputDirectory=lib

3) 配置 conf/logback-access.xml

cat <<EOF > conf/logback-access.xml
<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashAccessEncoder"/>
  </appender>
  <appender-ref ref="STDOUT" />
</configuration>
EOF

4) 配置 conf/server.xml.

增加 <Valve className="ch.qos.logback.access.tomcat.LogbackValve"/><Host name="localhost" 元素。 例如

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- logback access logs -->
        <Valve className="ch.qos.logback.access.tomcat.LogbackValve"/>

      </Host>

5) 启动tomcat

bin/startup.sh

6)tomcat启动后,点击root url,查看日志,可以看到json格式的访问日志条目。

$ curl http://localhost:8080/ > /dev/null

$ tail logs/catalina.out 
... snip ...
{"@timestamp":"2020-05-10T18:37:06.157-07:00","@version":"1","message":"127.0.0.1 - - [2020-05-10T18:37:06.157-07:00] \"GET / HTTP/1.1\" 200 -1","method":"GET","protocol":"HTTP/1.1","status_code":200,"requested_url":"GET / HTTP/1.1","requested_uri":"/","remote_host":"127.0.0.1","content_length":-1,"elapsed_time":461}
© www.soinside.com 2019 - 2024. All rights reserved.