Настройка логов 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/