Быстрый старт
Данный раздел представляет описание действий по безопасному подключению с использованием методов REST API.
Обращение из произвольного языка программирования
-
Настройте запись логов в файл по пути
log/log.log
. Обязательным полем являетсяserverEventDatetime
с форматом времени2022-07-20 18:29:02,912
. В Java это выполняется следующим образом:Раскрыть type=jsx - 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 =
-
Добавьте в
Deployment.yml
приложенияvolume
с пустой папкой для записи логов в секцииspec.template.spec
.Deployment.yml type=jsspec: volumes: - name: logger emptyDir: { }
-
Добавьте в основной контейнер созданный
volume
по пути, куда осуществляется запись логов в файл.Deployment.yml type=jsvolumeMounts: - name: logger mountPath: log
-
Подключите 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 (альтернативный вариант)
-
Добавьте зависимость в проект: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>
-
Добавьте
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>
-
К классу, где необходимо писать логи, добавьте аннотацию
@Slf4j
и настройте запись в логи черезlog.debug
("сообщения").log.debug type=jspackage 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(); } }
-
В Deployment приложения добавьте
volume
с пустой папкой для записи логов в секцииspec.template.spec
.Deployment.yml type=jsspec: volumes: - name: logger emptyDir: { }
-
Добавьте в основной контейнер созданный
volume
.Deployment.yml type=jsvolumeMounts: - name: logger mountPath: log
-
Подключите 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=yamlversion: "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=luafunction 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
- общая директория на виртуальной машине для сохранения логов приложений.
Настройка
- В файле
fluent-bit.conf
значение параметраINPUT.Path
должно содержать шаблон пути хранения логов для считывания внутри контейнера Fluent Bit (путь к общей директории на виртуальной машине). - В файле
fluent-bit.conf
значение параметровOUTPUT.Host
иOUTPUT.Port
должны содержать ссылку и порт для отправки логов на сервисlogstash
из паспорта стенда. - Данный пример настроен на считывание логов из одной общей директории логов. Следовательно, чтобы подключить к системе логирования каждое приложение, поднятое в docker-контейнере, необходимо указать параметр
volume
, привязанный к общей директории (или её поддериктории) для записи соответствующих логов; - Структуру и вложенность поддиректорий, формат наименования файлов логов, а также считывание из пути дополнительных данных можно настроить в скрипте
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=luafunction 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