#docker #parsing #match #fluent-bit
#docker #синтаксический анализ #совпадение #fluent-bit
Вопрос:
Я использую docker-compose, который генерирует более 20 сервисов. Большинство из них похожи, но анализируют разные форматы даты и времени или значения, которые немного отличаются. Моя идея ведения журнала заключается в том, чтобы записывать все в systemd, а затем передавать его через fluent-bit.
большинство сервисов в docker-compose выглядят примерно так (начало тега получает разные имена в зависимости от синтаксического анализатора, который я захочу использовать позже):
A-service:
image: A-service
restart: always
network_mode: host
depends_on:
- kafka
- schema-registry
environment:
- KAFKA_BROKERS=127.0.0.1:9092
- SCHEMA_REGISTRY_URL=127.0.0.1:8081
logging:
driver: journald
options:
tag: "dockerC/{{.ImageName}}/{{.Name}}/{{.ID}}"
B-service:
image: B-service
restart: always
network_mode: host
depends_on:
- kafka
- schema-registry
environment:
- KAFKA_BROKERS=127.0.0.1:9092
- SCHEMA_REGISTRY_URL=127.0.0.1:8081
logging:
driver: journald
options:
tag: "dockerJ/{{.ImageName}}/{{.Name}}/{{.ID}}"
fluent-bit.conf:
[SERVICE]
Flush 5
Daemon Off
Log_Level info
parsers_file parsers.conf
[INPUT]
Name systemd
Tag *
Path /run/log/journal
Systemd_Filter _SYSTEMD_UNIT=docker.service
Systemd_Filter _SYSTEMD_UNIT=kubelet.service
[FILTER]
Name parser
Parser dockerJ
Match dockerJ*
Key_Name MESSAGE
Reserve_Data On
Preserve_Key On
[FILTER]
Name parser
Parser dockerC
Match dockerC*
Key_Name MESSAGE
Reserve_Data On
Preserve_Key On
[OUTPUT]
Name es
Match *
Index fluent_bit
Type json
Retry_Limit false
Host ${ELASTICSEARCH_HOST}
Port ${ELASTICSEARCH_PORT}
HTTP_User ${ELASTICSEARCH_USERNAME}
HTTP_Passwd ${ELASTICSEARCH_PASSWORD}
tls off
tls.verify Off
parsers.conf
[PARSER]
Name dockerJ
Format json
Time_Key timeStamp
Time_Format %Y-%m-%dT%H:%M:%S.%L
Time_Keep On
# Command | Decoder | Field | Optional Action
# =============|==================|=================
Decode_Field_As escaped_utf8 MESSAGE do_next
Decode_Field json MESSAGE
[PARSER]
Name dockerC
Format json
Time_Key time
Time_Format %Y/%m/%d %H:%M:%S.%L
Time_Keep On
# Command | Decoder | Field | Optional Action
# =============|==================|=================
Decode_Field_As escaped_utf8 MESSAGE do_next
Decode_Field json MESSAGE
если я изменю соответствие фильтра:
Match dockerC*
-> Match *
Match dockerJ*
-> Match *
Он совпадает, и JSON анализируется без каких-либо проблем в es, но позже у меня возникают проблемы из-за разных форматов времени в моем эластичном поиске или ошибке fluent-bit invalid time format
Я мог бы отредактировать и создать примерно 8 разных полей [ВВОДА] с разными тегами, но для этого, похоже, просто недостаточно компьютерных ресурсов.
Итак, мой вопрос: как на самом деле использовать теги / фильтры и отправлять сообщения на основе Tags
, которые установлены вне области видимости fluent-bit
(как в данном случае — docker-compose.yml
)?
Комментарии:
1. Попробуйте использовать
stdout
вывод и посмотрите реальные теги, которые видит fluent-bit. Тег — это первая часть строки, которую регистрирует fluent-bit .2. [2] docker.service: [1603090688.558286000, {«ПРИОРИТЕТ»=> «6», «SYSLOG_IDENTIFIER»=>»kafka/confluentinc/cp-kafka:5.5.1/sentiveillance-server-unit_kafka_1/046e4274d9ba» , …. Это интересно. Я предполагаю, что [2] означает поток, а «docker.service:» — это тег, который устанавливается
Systemd_Filter _SYSTEMD_UNIT=docker.service
. Как я должен отличать один тег от другого на данный момент? Я попытался установить `Systemd_Filter dockerC *`, но, похоже, он по-прежнему соответствуетSystemd_Filter _SYSTEMD_UNIT=docker.service
документации и выполняет поиск — я не могу найти никакой хорошей документации по Systemd_Filter
Ответ №1:
Systemd_Filter _SYSTEMD_UNIT=docker.service
устанавливает ТЕГ как "docker.service"
, а не поле тега, которое я ожидал. Чтобы использовать нужный мне ТЕГ, мне нужно вручную изменить каждый ТЕГ. Что достижимо при добавлении моего rewrite_tag
фильтра:
[FILTER]
Name rewrite_tag
Match docker.service*
Rule $NAME_OF_THE_TAG_KEY .* $NAME_OF_THE_TAG_KEY false
Emitter_Name re_emitted
поскольку я хочу изменить каждое поле, я просто добавил .*
регулярное выражение, которое соответствует чему угодно