Logback Logstash Tomcat Доступ к журналу JSON
Кто-нибудь когда-нибудь получал журнал доступа Tomcat в виде JSON с помощью Logstas Logback Encoder?
Несмотря на то, что это должно быть возможно (согласно документам), я не могу заставить его работать, и я постоянно борюсь с адом пути к классам Tomcat. Tomcat выбрасывает NoClassDefFoundErrors, хотя я на 100% уверен, что классы должны существовать в пути к классам. Это просто больше не имеет смысла...
Я поместил все необходимые JAR в Tomcats lib/
каталог, добавил их в путь к классам и настроил все необходимые файлы конфигурации (следуя нескольким официальным и неофициальным руководствам).
Журнал 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
Добавление logback-access.jar (в дополнение ко всем другим JAR-файлам logback/slf4j/logstash) в путь к классам через bin / setenv.sh нарушает весь путь к классам (цикл сбоя с NoClassDefFoundError: org/apache/catalina/Lifecycle
). Добавление всех других JAR-файлов logback/slf4j/logstash без logback-access.jar работает нормально (но позже приводит кClassNotFoundException: ch.qos.logback.access.spi.IAccessEvent
но Tomcat работает нормально без записи журналов доступа) ...
Я даже не могу предоставить свое текущее состояние, потому что не знаю, какое состояние является наиболее "правильным", которое ближе всего к решению...
Если кто-то получил журнал доступа 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 ответ
Мне удалось получить журналы доступа 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) Установите необходимые зависимости в каталог lib 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) Запустите кота
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}