【问题标题】:Logback Logstash Tomcat Access JSON LogLogback Logstash Tomcat 访问 JSON 日志
【发布时间】:2020-08-21 18:23:47
【问题描述】:

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

即使它应该是可能的(根据文档)我无法让它工作,我一直在与 Tomcat 的类路径地狱作斗争。即使我 100% 确定类必须存在于类路径中,Tomcat 仍在抛出 NoClassDefFoundErrors。它只是没有任何意义了......

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

Tomcat 的日志 (catalina.out -> catalina.json) 与 Logstash Logback 编码器一起工作正常,但 Tomcat 的访问日志是一个完全不同的问题...

无论我尝试了什么,每次都会导致以下结果之一:

NoClassDefFoundError: javax/servlet/ServletContainerInitializer

NoClassDefFoundError: org/apache/catalina/Lifecycle

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

通过 bin/setenv.sh 将 logback-access.jar(除了所有其他 logback/slf4j/logstash JAR)添加到类路径会破坏整个类路径(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 中加载该类...我不知道这是如何工作的...

【问题讨论】:

    标签: tomcat logback slf4j logstash-logback-encoder jul-to-slf4j


    【解决方案1】:

    我能够使用以下过程获取 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

    &lt;Valve className="ch.qos.logback.access.tomcat.LogbackValve"/&gt; 添加到&lt;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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 2014-06-29
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多