Logback Logstash Tomcat访问JSON日志



有人用Logstas Logback Encoder将Tomcat的访问日志作为JSON获得过吗?

尽管这应该是可能的(根据文档(,但我无法让它正常工作,而且我一直在与Tomcat的类路径地狱作斗争。Tomcat抛出NoClassDefFoundErrors,尽管我100%确信类必须存在于类路径中。这已经没有任何意义了。。。

我将所有需要的JAR放入Tomcatslib/目录,将它们添加到类路径中,并设置所需的每个配置文件(遵循了多个官方和非官方教程(。

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

通过bin/setenv.sh将logback-acess.jar(以及所有其他logback/slf4j/logstash jar(添加到Classpath会破坏整个类路径(NoClassDefFoundError: org/apache/catalina/Lifecycle的崩溃循环(。添加所有其他没有logback-access.jar的logback/slf4j/logstash jar运行良好(但稍后会导致ClassNotFoundException: ch.qos.logback.access.spi.IAccessEvent,但Tomcat在没有写入访问日志的情况下运行良好(。。。

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

如果有人将Tomcat的访问日志作为JSON获得,请告诉我如何获得(即使您使用不同的编码器(。

我已经花了好几天的时间在谷歌上搜索、试错和所有的神经。。。

更新

以下是Tomcat的Classpath或ClassLoading是相当***的,没有任何意义(用-verbose:class启动JVM(,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

必须在另一个上下文/Classpath/ClassLoader中加载该类。。。我不知道这是怎么回事。。。

我能够使用以下过程获得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启动后,点击根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}

相关内容

  • 没有找到相关文章

最新更新