Быстрый старт

Данный раздел представляет описание действий по безопасному подключению с использованием методов REST API.

Быстрый старт с использованием Kubernetes

Обращение из произвольного языка программирования

  1. Настройте запись логов в файл по пути log/log.log. Обязательным полем является serverEventDatetime с форматом времени 2022-07-20 18:29:02,912. В Java это выполняется следующим образом:
    Раскрыть type=js
    x - b3 - traceid = x - b3 - spanid = x - b3 - parentspanid = x - b3 - sampled = x - b3 - flags = caller_file_name = Version.java serverEventDatetime = "2022-07-20 18:29:02,912"
    logLevel = INFO threadName = background - preinit message = "HV000001: Hibernate Validator 6.1.6.Final"
    exception = ""
    callerLine = 21 callerMethod = "Caller+0	 at org.hibernate.validator.internal.util.Version.<clinit>(Version.java:21)u2028Caller+1	 at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.<clinit>(AbstractConfigurationImpl.java:83)u2028Caller+2	 at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33)u2028Caller+3	 at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:296)u2028Caller+4	 at org.springframework.boot.autoconfigure.BackgroundPreinitializer$ValidationInitializer.run(BackgroundPreinitializer.java:141)u2028"
    loggerName = "il.Version"
    callerClass = o.h.validator.internal.util.Version levelStr = "INFO"
    levelInt = "INFO"
    mdc = 
    
  2. Добавьте в Deployment.yml приложения volume с пустой папкой для записи логов в секции spec.template.spec.
    Deployment.yml type=js
        spec:
        volumes:
            - name: logger
            emptyDir: { }
    
  3. Добавьте в основной контейнер созданный volume по пути, куда осуществляется запись логов в файл.
    Deployment.yml type=js
        volumeMounts:
            - name: logger
              mountPath: log
    
  4. Подключите Fluent Bit к приложению как отдельный контейнер.
    Deployment.yml type=js
    ...
       containers:
         - name: fluent-bit
           image: {адрес Docker-образа Fluent Bit. Данный Docker-образ является преднастроенным для вашего namespace, запись логов в который выполняется внутренним компонентом logstash по адресу `http://logstash5045`. Запросите адрес Docker-образа Fluent Bit для своего стенда у аккаунт-менеджера}
           volumeMounts:
             - name: logger
               mountPath: /usr/app/log
           terminationMessagePolicy: File
           env:
             - name: FLUENT_DEPLOYMENTUNIT
               valueFrom:
                 fieldRef:
                     fieldPath: metadata.name
             - name: FLUENT_SUBSYSTEM
               value: ИМЯ СИСТЕМЫ
             - name: FLUENT_DISTRIBVERSION
               value: ВЕРСИЯ КОМПОНЕНТА
    
      ...
    

Быстрый старт при использовании Java (альтернативный вариант)

  1. Добавьте зависимость в проект:
    pom.xml type=xml
    <dependencies>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-sleuth</artifactId>
         </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
  2. Добавьте logback.xml для корректного формирования файлов логов в src/main/resources:
    logback.xml type=xml
         <configuration debug="true">
             <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                 <layout class="ch.qos.logback.classic.PatternLayout">
                     <pattern>
                         <Pattern>
                             %-38(%d{yyyy-MM-dd HH:mm:ss} [%thread]) %-5level %logger{36} - %msg%n
                         </Pattern>
                     </pattern>
                 </layout>
             </appender>
    
             <appender name="FILE_FLUENT" class="ch.qos.logback.core.rolling.RollingFileAppender">
                  <file>log/log.log</file>
                 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                     <fileNamePattern>usr/app/log/log.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
                     <maxFileSize>100MB</maxFileSize>
                     <maxHistory>7</maxHistory>
                 </rollingPolicy>
                 <layout class="ch.qos.logback.classic.PatternLayout">
                     <pattern>
                         <Pattern>
                             x-b3-traceid=%X{X-B3-TraceId:-} x-b3-spanid=%X{X-B3-SpanId:-} x-b3-parentspanid=%X{X-B3-ParentSpanId:-} x-b3-sampled=%X{X-B3-Sampled:-} x-b3-flags=%X{X-B3-Flags:-} caller_file_name=%file serverEventDatetime="%d" logLevel=%level threadName=%thread  message="%replace(%replace(%m){'\n','\u2028'}){'\"','\''}" exception="%replace(%replace(%ex){'\"','\u2028'}){'\n','\u2028'}%nopex" callerLine=%L callerMethod="%replace(%caller){'\n','\u2028'}" loggerName="%10.10logger" callerClass=%logger{40} levelStr="%level" levelInt="%level" mdc= \n
                         </Pattern>
                     </pattern>
                 </layout>
             </appender>
    
             <root level="info" additivity="false">
                 <appender-ref ref="STDOUT"/>
                 <appender-ref ref="FILE_FLUENT"/>
             </root>
         </configuration>
    
  3. К классу, где необходимо писать логи, добавьте аннотацию @Slf4j и настройте запись в логи через log.debug ("сообщения").
    log.debug type=js
        package ru.sbt.logger;
    
        import lombok.RequiredArgsConstructor;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.web.bind.annotation.*;
    
        import javax.validation.Valid;
    
        @Slf4j
        @RestController
        @RequestMapping("/log")
        @RequiredArgsConstructor
        public class LoggerController {
            @PostMapping("/info")
            @ResponseBody
            public String createInfo(@RequestBody @Valid LoggerMessage body) {
                log.info(body.getMessage());
                return body.getMessage();
            }
    
            @PostMapping("/debug")
            @ResponseBody
            public String createDebug(@RequestBody @Valid LoggerMessage body) {
                log.debug(body.getMessage());
                return body.getMessage();
            }
    
            @PostMapping("/error")
            @ResponseBody
            public String createError(@RequestBody @Valid LoggerMessage body) {
                log.error(body.getMessage());
                return body.getMessage();
            }
        }
    
  4. В Deployment приложения добавьте volume с пустой папкой для записи логов в секции spec.template.spec.
    Deployment.yml type=js
        spec:
        volumes:
            - name: logger
            emptyDir: { }
    
  5. Добавьте в основной контейнер созданный volume.
    Deployment.yml type=js
        volumeMounts:
            - name: logger
              mountPath: log
    
  6. Подключите Fluent Bit к приложению как отдельный контейнер:
    Deployment.yml type=js
    ...
       containers:
         - name: fluent-bit
           image: {адрес Docker-образа Fluent Bit. Данный Docker-образ является преднастроенным для вашего namespace, запись логов в который выполняется внутренним компонентом logstash по адресу `http://logstash5045`. Запросите адрес Docker-образа Fluent Bit для своего стенда у аккаунт-менеджера}
           volumeMounts:
             - name: logger
               mountPath: /usr/app/log
           terminationMessagePolicy: File
           env:
             - name: FLUENT_DEPLOYMENTUNIT
               valueFrom:
                 fieldRef:
                     fieldPath: metadata.name
             - name: FLUENT_SUBSYSTEM
               value: ИМЯ СИСТЕМЫ
             - name: FLUENT_DISTRIBVERSION
               value: ВЕРСИЯ КОМПОНЕНТА
    
      ...
    

Быстрый старт с использованием виртуальной машины

Fluent Bit используется для сбора, преобразования и отправки логов в отдельное хранилище. Формат логов определяется клиентом, т.е. Fluent Bit настраивается исключительно под потребности пользователя. Время указывается по Гринвичу.
Дистрибутив Fluent Bit предоставляется по ссылке.
Ниже представлены два базовых сценария интеграции с системой журналирования при помощи Fluent Bit:

Увеличить

Первый сценарий представляет из себя добавление дополнительного контейнера к приложению клиента с отгрузкой его личного экземпляра logstash в его namespace.
Второй сценарий представляет из себя типичную архитектуру развёртывания Fluent Bit в контейнере на отдельно выделенной виртуальной машине. Logstash расположен на двух отдельно стоящих машинах в режиме failover.
Для подключения логирования на виртуальной машине необходимо поднять контейнер Fluent Bit со всеми конфигурационными файлами.
docker-compose.yaml type=yaml
version: "3.8"
services:
  fluentbit:
    container_name: fluentbit
    image: ${FLUENT_BIT_IMAGE_FROM_STAND_INFO}
    network_mode: "host"
    volumes:
      - ./convert_date.lua:/fluent-bit/etc/convert_date.lua
      - ./appNameVersionParser.lua:/fluent-bit/etc/appNameVersionParser.lua
      - ./parsers.conf:/fluent-bit/etc/parsers.conf
      - ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
      - /Users/${YourUser}/logger-test/log:/usr/app/log
    restart: always
convert_date.lua type=lua
function convert_date_efs(tag, timestamp, record)
  local pattern = "(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+),(%d+)"
  dt_str = record["serverEventDatetime"]
  local year, month, day, hour, minute, seconds, milliseconds = dt_str:match(pattern)
  ts = os.time{year = year, month = month, day = day, hour = hour, min = minute, sec = seconds }
  ts = (ts * 1000) + milliseconds
  record["serverEventDatetime"] = ts
  return 2, timestamp, record
end
parsers.conf type=json
[PARSER]
    Name        logfmt
    Format      logfmt
Описание параметров в fluent-bit/docker-compose.yaml:
  • services.fluentbit.image - образ Fluent Bit, указанный в паспорте вашего стенда;
  • convert_date.lua - скрипт, который преобразует DateTime в Timestamp;
  • appNameVersionParser.lua - скрипт, который считывает имя файла логов (в формате appName_version.log) и подставляет в параметры логов Fluent Bit;
  • parsers.conf - конфигурация формата парсинга данных Fluent Bit (можно использовать различные парсеры, подробнее об этом можно прочесть в документации Fluent Bit).
  • fluent-bit.conf - основная конфигурация Fluent Bit для обработки логов;
  • /Users/${YourUser}/logger-test/log - общая директория на виртуальной машине для сохранения логов приложений.

Настройка

  1. В файле fluent-bit.conf значение параметра INPUT.Path должно содержать шаблон пути хранения логов для считывания внутри контейнера Fluent Bit (путь к общей директории на виртуальной машине).
  2. В файле fluent-bit.conf значение параметров OUTPUT.Host и OUTPUT.Port должны содержать ссылку и порт для отправки логов на сервис logstash из паспорта стенда.
  3. Данный пример настроен на считывание логов из одной общей директории логов. Следовательно, чтобы подключить к системе логирования каждое приложение, поднятое в docker-контейнере, необходимо указать параметр volume, привязанный к общей директории (или её поддериктории) для записи соответствующих логов;
  4. Структуру и вложенность поддиректорий, формат наименования файлов логов, а также считывание из пути дополнительных данных можно настроить в скрипте appNameVersionParser.lua (может потребоваться изменение шаблона в INPUT.Path).
fluent-bit.conf type=json
[SERVICE]
    Flush         1
    Log_Level     info
    Daemon        off
    Parsers_File  /fluent-bit/etc/parsers.conf

[INPUT]
    Name   tail
    Path   /usr/app/log/*/*.log
    Path_Key  filename
    Tag    logstash
    Buffer_Chunk_Size 400k
    Buffer_Max_Size 6MB
    Mem_Buf_Limit 6MB
    Parser logfmt
    Refresh_Interval 20

[FILTER]
    Name record_modifier
    Match       logstash
    Record      subsystem virtual-dev

[FILTER]
    Name  lua
    Match  logstash
    script  /fluent-bit/etc/appNameVersionParser.lua
    call  extract_app_fields

[FILTER]
    Name        modify
    Match       logstash
    Hard_copy callerClass className
    Hard_copy x-b3-traceid traceId

[FILTER]
    Name    lua
    Match   logstash
    script  /fluent-bit/etc/convert_date.lua
    call    convert_date_efs

[OUTPUT]
    Name  http
    Host ${FILL_LOGSTASH_HOSTNAME}
    Port ${FILL_LOGSTASH_PORT}
    Format json
appNameVersionParser.lua type=lua
function extract_app_fields(tag, timestamp, record)
    local pattern = "/([^/-]+)-([^-]+).log"
    filename = record['filename']

    name, version = filename:match(pattern)
    record['deploymentUnit'] = name
    record['distribVersion'] = version

    return 2, timestamp, record
end

Демопримеры

В демопримерах реализованы стандартные сценарии, демонстрирующие работу отдельных сервисов Платформы ГосТех. Отправка тестовых запросов в демопримерах позволит вам ознакомиться с функциями того или иного сервиса. Доступные демопримеры и описания реализованной в них функциональности представлены ниже.
Журналирование
Создание и отправка на сервер трёх уровней логов: debug, error, info. Просмотр отправленных логов в Elastic
Предыдущий раздел
1.14 Журналирование
Следующий раздел
Просмотр журнала
Была ли страница полезной?