Fluent-Bit
FluentBit собирает, парсит и фильтрует сообщения из контейнеров, сохраняя их в хранилище Loki. Конфигурационные файлы fluent-bit.conf и parsers.conf расположены в папке /var/log/flb-storage/.
Встроенные парсеры
- docker — поддерживает объединение больших записей логов, разделённых движком контейнера Docker.
- cri — обрабатывает запись лога, генерированную движком контейнера CRI-O, поддерживает объединение записей логов.
- go — обрабатывает записи логов, генерируемые приложением на языке Go, и выполняет объединение, если обнаружены мультистроковые сообщения.
- python — обрабатывает записи логов, генерируемые приложением на языке Python, и выполняет объединение, если обнаружены мультистроковые сообщения.
Service
- Flush 5 — интервал (в секундах), через который Fluent Bit будет отправлять собранные данные (логи) в Loki;
- Daemon Off — указывает, что Fluent Bit не будет работать в фоновом режиме (демоне);
- Parsers_File parsers.conf — задает файл, в котором находятся определения парсеров (форматов логов).
Input
- Name forward — тип входного плагина, используемого Fluent Bit для приема данных. В данном случае используется плагин forward, который позволяет принимать данные через сеть (протокол Fluentd Forward);
- Listen 0.0.0.0 — указывает на то, что Fluent Bit будет слушать на всех доступных сетевых интерфейсах;
- Port 24224 — порт, на котором Fluent Bit принимает входящие данные.
[INPUT] Name tail Tag tenant.* Path /var/log/containers/*_tenant2_webapp-*.log Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser container_firstline Parser docker DB /var/log/flb-storage/flb_container.db Mem_Buf_Limit 50MB Skip_Long_Lines On Refresh_Interval 10 Rotate_Wait 30 storage.type filesystem Read_from_Head ${READ_FROM_HEAD} [INPUT] Name tail Tag kube.* Path /var/log/containers/*.log Parser docker DB /var/log/flb_graylog.db DB.Sync Normal Docker_Mode On Buffer_Chunk_Size 512KB Buffer_Max_Size 5M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 [FILTER] Name kubernetes Match kube.* Merge_Log On Merge_Log_Key log Keep_Log Off K8S-Logging.Parser On K8S-Logging.Exclude Off Annotations Off Labels On
[INPUT[] Name tail Tag kube.* Path /var/log/containers/*.log DB /var/log/flb_kubernetes.db Parser docker Docker_Mode On Mem_Buf_Limit 64MB Skip_Long_Lines On Refresh_Interval 10 [INPUT] Name tail Tag application.* Exclude_Path /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy* Path /var/log/containers/*.log Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser container_firstline Parser docker DB /var/fluent-bit/state/flb_container.db Mem_Buf_Limit 50MB Skip_Long_Lines On Refresh_Interval 10 Rotate_Wait 30 storage.type filesystem [INPUT] Name tail Tag user-api.* Path /var/log/containers/user-api*.log Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser container_firstline_user Parser docker DB /var/fluent-bit/state/flb_user_api.db Mem_Buf_Limit 50MB Skip_Long_Lines On Refresh_Interval 10 Rotate_Wait 30 storage.type filesystem Read_from_Head ${READ_FROM_HEAD} [INPUT] Name tail Tag application.* Exclude_Path /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy* Path /var/log/containers/*.log Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser container_firstline Parser docker DB /var/fluent-bit/state/flb_container.db Mem_Buf_Limit 50MB Skip_Long_Lines On Refresh_Interval 10 Rotate_Wait 30 Read_from_Head Off [INPUT] Name tail Tag application.* Path /var/log/containers/fluent-bit* Parser docker DB /var/fluent-bit/state/flb_log.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 Read_from_Head Off [INPUT] Name tail Tag application.* Path /var/log/containers/cloudwatch-agent* Multiline.parser docker,cri # Docker_Mode On # Docker_Mode_Flush 5 # Docker_Mode_Parser cwagent_firstline #Parser docker DB /var/fluent-bit/state/flb_cwagent.db rotate_wait 15 Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 #Read_from_Head true [INPUT] Name tail Path /var/log/containers/abc-*.log, /var/log/containers/def-*.log, /var/log/containers/ghi-*.log, /var/log/containers/jkl-*.log, /var/log/containers/mno-*.log Exclude_Path /var/log/containers/aggregator-fluent-bit-*_logging_fluent-bit-*.log, /var/log/containers/aws-node*.log, /var/log/containers/collector-fluent-bit-*_logging_fluent-bit-*.log, /var/log/containers/kube-proxy*.log DB /var/fluent-bit/state/flb_container.db multiline.parser docker, cri Tag kube.* threaded on Mem_Buf_Limit 32MB Skip_Long_Lines On Skip_Empty_Lines On Refresh_Interval 10 Rotate_Wait 30 # Buffering & Storage (https://docs.fluentbit.io/manual/administration/buffering-and-storage#input-section-configuration) storage.type filesystem
[INPUT]
Name tail
Path /var/log/containers/*.log
Docker_Mode On
Docker_Mode_Parser python-multiline
[INPUT] Name tail Path /var/log/containers/*.log Parser docker Tag kube.* Refresh_Interval 5 Mem_Buf_Limit 5MB Skip_Long_Lines On DB /tail-db/tail-containers-state.db DB.Sync Normal Ignore_Older 2d Multiline On Multiline_Flush 5 Parser_Firstline first_line
Filter
- Name parser — тип фильтра. Фильтр parser, который применяет парсеры для обработки данных;
- Parser docker — задает парсер для Docker-логов;
- Match _ — задает шаблон для сопоставления входящих данных с фильтром. Символ _ означает, что фильтр применяется ко всем входным данным;
- Key_Name log — указывает, какое поле данных необходимо парсить. В данном случае поле с именем log;
- Reserve_Data true — сохранение оригинальных данных после их обработки фильтром;
- Preserve_Key false — после парсинга исходное поле (в данном случае log) будет удалено.
[MULTILINE_PARSER] name multiline-docker-python type regex flush_timeout 3000 # fluent-bit is not looking at the log field to run the regex below key_content log # rules | state name | regex pattern | next state # ------|---------------|------------------------------------------------------- rule "start_state" "/(\d+-\d+-\d+ \d+:\d+:\d+,\d+):(.*)/" "cont" rule "cont" "^((?!\d+-\d+-\d+ \d+:\d+:\d+,\d+).*)" "cont"
[PARSER] Name python-multiline Format regex Regex /(?<time>\d+-\d+-\d+ \d+:\d+:\d+,\d+):(?<message>.*)/ Time_Key time Time_Format %F %H:%M:%S,%L Input:
[PARSER] Name springboot Format regex Regex (?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}.\d{1,3}) (?<level>[^ ]*) (?<number>\d*) --- (?<thread>\[[^ ]*) (?<logger>[^ ]*) *: (?<message>[^ ].*)$ Time_Key time Time_Format %Y-%m-%d %H:%M:%S.%L [PARSER] Name docker Format json Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L Time_Keep On # Command | Decoder | Field | Optional Action # =============|==================|================= Decode_Field_As escaped log
[FILTER] Name parser Match kube.* Key_Name log Parser parser_json Parser parser_logs [PARSER] Name parser_logs Format regex Regex ^(?<time_stamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (?<environment>.*?): (?<hostname>.*?): (?<module>.*?)::(?<line>\d+) (?<log_level>[A-Z]+): (?<message>[a-zA-Z0-9 _.,:()'"!¡]*)$ Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z [PARSER] Name parser_json Format regex Regex ^(?<time_stamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}): (?<environment>.*?): (?<hostname>.*?): (?<module>.*?)::(?<line>\d+) (?<log_level>[A-Z]+): (?<message>[^{]*)(?<message_additional>{.*)$ Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z Decode_Field_As escaped_utf8 message_additional do_next Decode_Field_As escaped message_additional do_next Decode_Field_As json message_additional [PARSER] Name container_firstline Format regex Regex (?<log>(?<="log":")\S(?!\.).*?)(?<!\\)".*(?<stream>(?<="stream":").*?)".*(?<time>\d{4}-\d{1,2}-\d{1,2}T\d{2}:\d{2}:\d{2}\.\w*).*(?=}) Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%LZ [PARSER] Name docker Format json Time_Key @timestamp Time_Format %Y-%m-%dT%H:%M:%S.%L Time_Keep Off
[MULTILINE_PARSER] name multiline-regex type regex flush_timeout 1000 # rules | state name | regex pattern | next state # ------|---------------|----------------------------------|----------- rule "start_state" "/(Dec \d+ \d+\:\d+\:\d+)(.*)/" "cont" rule "cont" "/^\s+at.*/" "cont"
Output
- Name grafana-loki — плагин для отправки данных в систему Grafana Loki, которая занимается сбором и хранением логов;
- Match * — отправляет все данные (все потоки логов);
- Url ${LOKI_URL} — URL, куда отправляются данные, задан в файле docker-compose.yml. LOKI_URL=http://loki:3100/loki/api/v1/push;
- RemoveKeys container_id — удаляет ключи container_id из отправляемых данных, чтобы не отправлять ненужные поля в Loki;
- Labels {service_name="planr"} — добавляет статическую метку (label) service_name="planr" к каждому потоку логов. Эти метки используются в Loki для облегчения поиска и фильтрации логов;
- LabelKeys level, source — указывает, какие ключи из логов использовать для динамических меток. В данном случае метки будут добавляться на основе полей level (уровень логов) и source (источник данных);
- BatchWait 1s — Fluent Bit ждет 1 секунду перед отправкой данных в батче;
- BatchSize 1001024 — максимальный размер батча для отправки данных — 1 МБ (1001024 байта);
- LineFormat json — отправляет данные в формате JSON.
- Name file - Плагин вывода file позволяет записывать данные, полученные через плагин ввода в файл;
- Match * — отправляет все данные (все потоки логов);
- Path - путь к каталогу для хранения файлов.
[SERVICE] Flush 1 Daemon Off Log_Level info Parsers_File parsers.conf Parsers_File custom_parsers.conf HTTP_Server On HTTP_Listen 0.0.0.0 HTTP_Port 2020 [INPUT] Name tail Path /var/log/containers/*.log Parser docker Tag kube.* Mem_Buf_Limit 4MB Skip_Long_Lines On Skip_Empty_Lines On [FILTER] Name kubernetes Match kube.* Merge_Log On Keep_Log On K8S-Logging.Parser On K8S-Logging.Exclude On [OUTPUT] Name loki Match kube.* Host loki.logging.svc.cluster.local Port 3100 Labels job=fluent, namespace=$kubernetes['namespace_name'], pod=$kubernetes['pod_name'], container=$kubernetes['container_name'] Auto_kubernetes_labels off Line_format json
[SERVICE] Flush 2 Log_Level info Daemon Off Parsers_File parsers.conf Parsers_File custom_parsers.conf HTTP_Server On HTTP_Listen 0.0.0.0 HTTP_Port 2020 [INPUT] Name tail Tag application.* Exclude_Path /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy* Path /var/log/containers/*.log Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser container_firstline Parser docker DB /var/fluent-bit/state/flb_container.db Mem_Buf_Limit 50MB Skip_Long_Lines On Refresh_Interval 10 Rotate_Wait 30 Read_from_Head Off [INPUT] Name tail Tag application.* Path /var/log/containers/fluent-bit* Parser docker DB /var/fluent-bit/state/flb_log.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 Read_from_Head Off [INPUT] Name tail Tag application.* Path /var/log/containers/cloudwatch-agent* #Parser multiline Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser cwagent_firstline Parser docker DB /var/fluent-bit/state/flb_cwagent.db rotate_wait 15 Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 #Read_from_Head true [FILTER] Name kubernetes Match application.* Kube_URL https://kubernetes.default.svc:443 Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token Kube_Tag_Prefix application.var.log.containers. Merge_Log On Merge_Log_Key pod_name K8S-Logging.Parser On K8S-Logging.Exclude Off Labels Off Annotations Off [FILTER] Name multiline Match application.* multiline.key_content log multiline.parser go, multiline-regex-test [OUTPUT] Name cloudwatch_logs Match application.* region ${REGION} log_group_name /aws/containerinsights/${CLUSTER_NAME}/application log_stream_prefix ${APP_POD_NAMESPACE}- auto_create_group true extra_user_agent container-insights [INPUT] Name systemd Tag dataplane.systemd.* Systemd_Filter _SYSTEMD_UNIT=docker.service Systemd_Filter _SYSTEMD_UNIT=kubelet.service DB /var/fluent-bit/state/systemd.db Path /var/log/journal Read_From_Tail Off [INPUT] Name tail Tag dataplane.tail.* Path /var/log/containers/aws-node*, /var/log/containers/kube-proxy* Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser container_firstline Parser docker DB /var/fluent-bit/state/flb_dataplane_tail.db Mem_Buf_Limit 50MB Skip_Long_Lines On Refresh_Interval 10 Rotate_Wait 30 Read_from_Head Off [FILTER] Name modify Match dataplane.systemd.* Rename _HOSTNAME hostname Rename _SYSTEMD_UNIT systemd_unit Rename MESSAGE message Remove_regex ^((?!hostname|systemd_unit|message).)*$ [FILTER] Name aws Match dataplane.* imds_version v1 [OUTPUT] Name cloudwatch_logs Match dataplane.* region ${REGION} log_group_name /aws/containerinsights/${CLUSTER_NAME}/dataplane log_stream_prefix ${APP_POD_NAMESPACE}-${APP_POD_NAME}- auto_create_group true extra_user_agent container-insights [INPUT] Name tail Tag host.dmesg Path /var/log/dmesg Parser syslog DB /var/fluent-bit/state/flb_dmesg.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 Read_from_Head Off [INPUT] Name tail Tag host.messages Path /var/log/messages Parser syslog DB /var/fluent-bit/state/flb_messages.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 Read_from_Head Off [INPUT] Name tail Tag host.secure Path /var/log/secure Parser syslog DB /var/fluent-bit/state/flb_secure.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 Read_from_Head Off [FILTER] Name aws Match host.* imds_version v1 [OUTPUT] Name cloudwatch_logs Match host.* region ${REGION} log_group_name /aws/containerinsights/${CLUSTER_NAME}/host log_stream_prefix ${APP_NODE_NAME}. auto_create_group true extra_user_agent container-insights
