Logback Logsta sh Доступ Tomcat JSON Журнал - PullRequest
0 голосов
/ 06 мая 2020

Кто-нибудь когда-либо получал журнал доступа Tomcat как JSON с Logstas Logback Encoder?

Хотя это должно быть возможно (согласно документам), я не могу заставить его работать, и я постоянно борюсь с Ад пути к классам Tomcat. Tomcat выбрасывает NoClassDefFoundErrors, хотя я на 100% уверен, что классы должны существовать в пути к классам. Это просто больше не имеет смысла ...

Я поместил все необходимые JAR-файлы в каталог Tomcats lib/, добавил их в путь к классам и настроил все необходимые файлы конфигурации (следовал нескольким официальным и неофициальным руководствам).

Журнал Tomcat (catalina.out -> catalina. json) отлично работает с Logsta sh Logback Encoder, но журнал доступа Tomcat - это совершенно другая проблема ...

Нет независимо от того, что я пробовал, каждый раз это приводило к одному из следующих:

NoClassDefFoundError: javax/servlet/ServletContainerInitializer

NoClassDefFoundError: org/apache/catalina/Lifecycle

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

Добавление logback-access.jar (в дополнение ко всем другим logback / slf4j / logsta sh JAR) в путь к классам через bin /setenv.sh разбивает весь путь к классам (cra sh -l oop с NoClassDefFoundError: org/apache/catalina/Lifecycle). Добавление всех остальных logback / slf4j / logsta sh JAR без logback-access.jar работает нормально (но позже приводит к ClassNotFoundException: ch.qos.logback.access.spi.IAccessEvent, но Tomcat работает нормально без записи журналов доступа) ...

I не могу даже предоставить свое текущее состояние, потому что я не знаю, какое состояние является наиболее "правильным", которое ближе всего к решению ...

Если кто-то получил журнал доступа Tomcat как JSON, скажите мне как (даже если вы используете другой кодировщик).

Это уже стоило мне нескольких дней поиска в Google, проб и ошибок и всех моих нервов ...

ОБНОВЛЕНИЕ

Вот доказательство того, что 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

.. .

Класс должен быть загружен в другом контексте / Classpath / ClassLoader ... Понятия не имею, как это работает ...

1 Ответ

0 голосов
/ 11 мая 2020

Мне удалось получить журналы доступа tomcat в формате JSON, используя следующий процесс:

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 каталог

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-адрес root, проверьте журналы и посмотрите запись журнала доступа в 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}
...