Полезная статья: https://habr.com/ru/companies/otus/articles/703882/
Оффициальный сайт: https://graylog.org/
Что такое логгеры в Java?
Перевод без воды и с примерами статьи: https://graylog.org/post/understanding-java-logs/
- Loggers: захватывать события, называемые LogRecords, и пересылать их в указанный Appender
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class UserController {
...
log.info("attempt to add a user {}" , user); - Appenders/Handlers: используйте Layout для форматирования LogRecords и отправки их на вывод, например в консоль, файл или другое приложение.
Ниже описание файла конфигурации для логирования в Greylog запущенный локально.
defaults.xml является частью внутренней конфигурации Spring Boot для системы логирования Logback. Он содержит настройки по умолчанию, такие как правила преобразования, шаблоны и общие конфигурации логгеров.
Видно что мы используем 2 аппендера:
- console-appender
- de.appelgriepsch.logback.GelfAppender
- Layouts/Formatters: конвертировать и форматировать данные LogRecord
В примере я использую ch.qos.logback.classic.PatternLayout и в тэге pattern настраиваю формат лога.
src/main/resources/logback-spring.xml
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<appender name="gelf" class="de.appelgriepsch.logback.GelfAppender">
<server>127.0.0.1</server>
<port>12201</port>
<protocol>UDP</protocol>
<includeSource>true</includeSource>
<includeMDC>true</includeMDC>
<queueSize>512</queueSize>
<connectTimeout>1000</connectTimeout>
<reconnectDelay>500</reconnectDelay>
<additionalFields>method=${springAppName}</additionalFields>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{mdcData} - %msg%n</pattern>
<additionalField>app=cdp</additionalField>
</layout>
</appender>
<root level="debug">
<appender-ref ref="CONSOLE" />
<appender-ref ref="gelf" />
</root>
</configuration> Для локального запуска:
В своем проекте я использую build.gradle.kts на языке Kotlin, но вам не составит труда найти как написать то же самое на привычных Maven или Gradle (Groovy)
implementation("org.springframework.boot:spring-boot-starter-logging") // Logback по умолчанию
// https://mvnrepository.com/artifact/de.appelgriepsch.logback/logback-gelf-appender
implementation("de.appelgriepsch.logback:logback-gelf-appender:1.5")
// Зависимость для Logstash Logback Encoder (при версиях 7, 8 и выше настройки в logback-spring.xml будут другие!
implementation("net.logstash.logback:logstash-logback-encoder:6.6") И наконец-то сам Greylog я запускаю через Docker Desktop на Windows
services:
mongo:
image: mongo:6.0
container_name: graylog-mongo
networks:
- graylog-network
elasticsearch:
image: opensearchproject/opensearch:2.10.0
container_name: graylog-opensearch
networks:
- graylog-network
environment:
- "discovery.type=single-node"
- "plugins.security.disabled=true"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9200"]
interval: 30s
timeout: 10s
retries: 5
graylog:
image: graylog/graylog:5.1
container_name: graylog
networks:
- graylog-network
depends_on:
- mongo
- elasticsearch
environment:
GRAYLOG_OPENSEARCH_HOSTS: "http://elasticsearch:9200"
GRAYLOG_HTTP_EXTERNAL_URI: "http://127.0.0.1:9000/"
GRAYLOG_ROOT_USERNAME: "admin"
GRAYLOG_ROOT_PASSWORD_SHA2: "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8" # password
GRAYLOG_PASSWORD_SECRET: "KRTEjf3C427FHgkW"
ports:
- "9000:9000" # Веб-интерфейс
- "12201:12201/udp" # Gelf UDP
graylog-setup:
image: debian:bullseye-slim
container_name: graylog-setup
networks:
- graylog-network
depends_on:
- graylog
volumes:
- ./graylog-setup.sh:/graylog-setup.sh
entrypoint: >
bash -c "apt-get update &&
apt-get install -y curl &&
bash /graylog-setup.sh"
networks:
graylog-network: Запустить Graylog
docker-compose up
Зайти на http://127.0.0.1:9000
логин: admin
пароль: password
Тут комментарии: https://github.com/Graylog2/docker-compose
Рекомендации
Советую вам также использовать аспектное программирование AOP для вынесения сквозной функциональности, например покрытие логированием всех контроллеров или сервисов

