Централизация логирования микросервисов с GreyLog

Java

Полезная статья: 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 аппендера:

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

Оцените автора
Kosenkov.Pro
Добавить комментарий