docker-compose.fluentbit.yml
version: '3.8'
services:
fluent-bit:
image: fluent/fluent-bit:latest
restart: always
environment:
TZ: 'Europe/Moscow'
configs:
- source: fluent-bit-conf
target: /fluent-bit/etc/fluent-bit.conf
- source: parsers-conf
target: /fluent-bit/etc/parsers.conf
volumes:
# Монтируем директорию с контейнерами Docker
- /var/lib/docker/containers:/var/lib/docker/containers:ro
# Монтируем Docker socket для получения метаданных
- /var/run/docker.sock:/var/run/docker.sock:ro
# Для отслеживания позиции в файлах
- fluent-bit-state:/tail-db
networks:
- localnetwork
deploy:
mode: global # Запускаем на каждом узле Swarm
resources:
limits:
memory: 300M
reservations:
memory: 100M
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
volumes:
fluent-bit-state:
configs:
fluent-bit-conf:
file: ./fluent-bit.conf
parsers-conf:
file: ./parsers.conf
networks:
localnetwork:
external: true
fluent-bit.conf
[SERVICE]
Flush 1
Log_Level info
Daemon off
Parsers_File parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
# Вход для Docker JSON логов
[INPUT]
Name tail
Path /var/lib/docker/containers/*/*.log
Tag docker.*
Parser docker
Docker_Mode On
Docker_Mode_Flush 4
Mem_Buf_Limit 50MB
Skip_Long_Lines On
Refresh_Interval 10
DB /tail-db/docker.db
DB.sync normal
# Парсинг JSON логов
[FILTER]
Name parser
Match docker.*
Key_Name log
Parser json_auto
Reserve_Data On
# Добавление Docker метаданных
[FILTER]
Name kubernetes
Match docker.*
Kube_Tag_Prefix docker.var.log.containers.
Merge_Log On
Merge_Log_Key log_processed
K8S-Logging.Parser On
K8S-Logging.Exclude On
# Альтернативный фильтр для Docker метаданных (если kubernetes не работает)
[FILTER]
Name nest
Match docker.*
Operation lift
Nested_under log_processed
Add_prefix log_
# Обогащение логов
[FILTER]
Name modify
Match docker.*
Add environment production
Add cluster docker_swarm
Add log_source docker_json
# Выход для отладки
[OUTPUT]
Name stdout
Match *
Format json_lines
# Пример выхода в Elasticsearch
# [OUTPUT]
# Name es
# Match *
# Host 192.168.1.10
# Port 9200
# Index docker-logs
# Type _doc
parsers.conf
[PARSER]
Name docker
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%LZ
Time_Keep On
[PARSER]
Name json_auto
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%LZ
Time_Keep On
# Парсер для многострочных логов GitLab
[PARSER]
Name gitlab_multiline_firstline
Format regex
Regex ^{"time":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z"
[MULTILINE_PARSER]
Name gitlab_multiline
Type regex
Flush_Timeout 1000
Rule "start_state" "^{"time":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z" "cont"
Rule "cont" "^(?!{"time":"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z).*" "cont"
Установка
# Создайте директорию для конфигов
$ mkdir -p fluentbit-docker
$ cd fluentbit-docker
# Создайте файлы конфигурации
$ cat > docker-compose.fluentbit.yml << 'EOF'
# [вставьте содержимое docker-compose.fluentbit.yml выше]
EOF
$ cat > fluent-bit.conf << 'EOF'
# [вставьте содержимое fluent-bit.conf выше]
EOF
$ cat > parsers.conf << 'EOF'
# [вставьте содержимое parsers.conf выше]
EOF
# Разверните стек
$ docker stack deploy -c docker-compose.fluentbit.yml fluentbit
Проверка работы
# Проверьте сервисы
docker service ls
# Посмотрите логи Fluent-Bit
docker service logs fluentbit_fluent-bit
# Проверьте, что Fluent-Bit видит файлы
docker exec -it $(docker ps -q -f name=fluentbit) ls -la /var/lib/docker/containers/