Две проблемы:
- Вы не хотите анализировать файлы журналов.Потому что никто не хочет писать регулярные выражения для разбора, и это подвержено ошибкам.
- Если у вас более динамическая настройка контейнера, вы не хотите входить в файлы, так как настройка всех подключенных в каталог каталогов или файлов выполняетсяa PITA.
Чтобы устранить первую проблему, добавьте приложение журнала для входа в JSON.Я использую Logback здесь, и вам нужно добавить net.logstash.logback:logstash-logback-encoder
зависимость:
<appender name="json" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH:-.}/your-app-name.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>your-app-name.json.%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<mdc/>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"log.level": "%level",
"service.name": "${springAppName:-}",
"process.pid": "${PID:-}",
"thread": "%thread",
"class": "%logger",
"mdc": "%mdc",
"message": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
Затем вы можете собрать этот файл и отправить его в Elasticsearch;все поля будут хорошо извлечены, и ваши многострочные операторы журнала (например, трассировки стека) также не будут разбиты:
filebeat.inputs:
# Collect the JSON log files from the Spring Boot apps
- type: log
paths:
- /var/log/apps/*.json
json.keys_under_root: true
json.add_error_key: true
output.elasticsearch:
hosts: ["{{ elasticsearch_host }}"]
Вторая проблема немного сложнее.Я бы использовал журнал JSON по умолчанию, который предоставляет Docker, чтобы ваше Java-приложение могло просто войти в консоль:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %logger{36} [%thread] - %mdc - %msg %n</pattern>
<charset>utf8</charset>
</encoder>
</appender>
Тогда Filebeat может автоматически собрать все журналы Docker (Filebeat должен иметь доступ к /var/lib/docker/containers:/var/lib/docker/containers:ro
чтобы это работало):
filebeat.autodiscover:
providers:
- type: docker
Чтобы избежать проблемы с анализом в первой части, вам действительно нужно зарегистрировать JSON на консоли, а затем собрать это.