Настройка логов GitLab в Docker Swarm

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/