Полезная статья: 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 для вынесения сквозной функциональности, например покрытие логированием всех контроллеров или сервисов