Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
software:fluent-bit-loki-grafana:fluent-bit:docker-swarm-syslog-ng [2025/12/06 03:36] – создано mirocowsoftware:fluent-bit-loki-grafana:fluent-bit:docker-swarm-syslog-ng [2025/12/07 00:56] (текущий) mirocow
Строка 17: Строка 17:
     http_listen               0.0.0.0     http_listen               0.0.0.0
     http_port                 2020     http_port                 2020
 +    coro_stack_size           24576
 +    plugins_path              /fluent-bit/bin/
  
 # ==================== ASUS ROUTER SYSLOG INPUT ==================== # ==================== ASUS ROUTER SYSLOG INPUT ====================
Строка 34: Строка 36:
     Path              /var/lib/docker/containers/*/*.log     Path              /var/lib/docker/containers/*/*.log
     Parser            docker     Parser            docker
-    Refresh_Interval  10+    Refresh_Interval  5
     Ignore_Older      1h     Ignore_Older      1h
     Docker_Mode       On     Docker_Mode       On
Строка 45: Строка 47:
     Storage.Type      filesystem     Storage.Type      filesystem
     Read_from_Head    false     Read_from_Head    false
 +
 +# Только для отладки
 +# [INPUT]
 +#     Name              tail
 +#     Path              /var/lib/docker/containers/*/*.log
 +#     Parser            docker
 +#     Refresh_Interval  10
 +#     Docker_Mode       On
 +#     Tag               docker.<file_name>
 +#     Tag_Regex         (?<file_name>[a-f0-9]*)-json.log
 +#     Mem_Buf_Limit     50MB
 +#     Skip_Long_Lines   On
 +#     DB                /var/log/flb-storage/flb_db.db
 +#     DB.sync           normal
 +#     Storage.Type      filesystem
 +#     Read_from_Head    true
 +
 +# ==================== DOCKER FILTERS ====================
  
 # Фильтруем пустые логи # Фильтруем пустые логи
Строка 82: Строка 102:
     whitelist_key       controller     whitelist_key       controller
     whitelist_key       line_id     whitelist_key       line_id
- 
-# 
-# ПАРСЕРЫ ДЛЯ РАЗНЫХ ТИПОВ ЛОГОВ 
-# 
  
 [FILTER] [FILTER]
Строка 219: Строка 235:
     copy                log _raw     copy                log _raw
     copy                parsed_data _parsed     copy                parsed_data _parsed
 +    # copy                exception_class _class
 +    # copy                exception_message _message
 +    # copy                exception_backtrace _backtrace
  
     copy                docker.label_project project     copy                docker.label_project project
Строка 247: Строка 266:
     match               docker.*     match               docker.*
     rule                $logging ^enabled$ data.$container_id true     rule                $logging ^enabled$ data.$container_id true
 +
 +# ==================== ROUTER FILTERS ====================
 +
 +[FILTER]
 +    Name                parser
 +    Match               router.*
 +    Key_Name            message
 +    Parser              router_logs
 +    Reserve_Data        true
 +
 +[FILTER]
 +    Name                record_modifier
 +    Match               router.*
 +    Record              hostname ${HOSTNAME}
 +    Record              device_type router
 +    Record              source asus_merlin
 +    Record              cluster docker_swarm
 +
 +[FILTER]
 +    Name                modify
 +    Match               router.*
 +    Rename              host source_host
 +    Rename              ident facility
 +    Set                 log_type syslog
 +    Set                 environment production
 +
 +# Отфильтровываем служебные контейнеры
 +[FILTER]
 +    Name                grep
 +    Match               docker.*
 +    Exclude             container_name ^/loki.*
 +    Exclude             container_name ^/fluent-bit.*
 +    Exclude             container_name ^/grafana.*
 +    Exclude             container_name ^/traefik.*
  
 [FILTER] [FILTER]
Строка 279: Строка 332:
     whitelist_key       logging_jobname     whitelist_key       logging_jobname
  
-==================== ROUTER FILTERS ==================== +Логи docker в Loki 
-# Очищаем и структурируем логи роутера +[OUTPUT
-[FILTER+    name                loki 
-    Name                parser +    match               data.* 
-    Match               router.* +    host                loki 
-    Key_Name            message +    port                3100 
-    Parser              router_logs +    labels              job=$logging_jobname, node_name=$node_name, container_id=$container_id, container_name=$container_name, service_name=$service_name, project=$project, service=$service, level=$stream 
-    Reserve_Data        true +    line_format         json 
- +    auto_kubernetes_labels off
-[FILTER] +
-    Name                record_modifier +
-    Match               router.* +
-    Record              hostname ${HOSTNAME} +
-    Record              device_type router +
-    Record              source asus_merlin +
- +
-# Добавляем важные поля из syslog +
-[FILTER] +
-    Name                modify +
-    Match               router.* +
-    Rename              host source_host +
-    Rename              ident facility +
-    Set                 log_type syslog+
  
-# ==================== OUTPUTS ==================== 
 # Логи роутера в Loki # Логи роутера в Loki
 [OUTPUT] [OUTPUT]
Строка 310: Строка 348:
     Host                loki     Host                loki
     Port                3100     Port                3100
-    Labels              job=asus_router, device_type=router, source=syslog +    Labels              job=asus_router, device_type=router, source=syslog, cluster=docker_swarm
-    Label_Keys          source_host,facility,severity+
     Line_Format         key_value     Line_Format         key_value
     Auto_Kubernetes_Labels off     Auto_Kubernetes_Labels off
- 
-# Docker логи в Loki 
-[OUTPUT] 
-    name                loki 
-    match               data.* 
-    host                loki 
-    port                3100 
-    labels              job=$logging_jobname, node_name=$node_name, container_id=$container_id, container_name=$container_name, service_name=$service_name, project=$project, service=$service, level=$stream 
-    label_keys          $node_name,$container_id,$container_name,$service_name,$project,$service 
-    line_format         json 
-    auto_kubernetes_labels off 
  
 # Только для отладки # Только для отладки
 # [OUTPUT] # [OUTPUT]
 #     name                stdout #     name                stdout
-#     match               *+#     match               data.*
 #     format              json #     format              json
 </code> </code>
  
-=== parsers.conf === 
- 
-<code ini> 
-# Базовый парсер для Docker JSON логов 
-[PARSER] 
-    Name        docker 
-    Format      json 
-    Time_Key    time 
-    Time_Format %Y-%m-%dT%H:%M:%S.%LZ 
-    Time_Keep   On 
- 
-# Nginx access логи 
-[PARSER] 
-    Name        nginx_access 
-    Format      regex 
-    Regex       ^(?<remote_ip>[^ ]*) - - \[(?<timestamp>[^\]]*)\] "(?<method>\w+) (?<path>[^ ]*) HTTP/[0-9.]+" (?<status>\d+) (?<body_bytes>\d+) "(?<referrer>[^"]*)" "(?<user_agent>[^"]*)" 
-    Time_Key    timestamp 
-    Time_Format %d/%b/%Y:%H:%M:%S %z 
- 
-# Gitlab JSON логи (application logs) 
-[PARSER] 
-    Name        gitlab_json 
-    Format      json 
-    # Time_Key    time    # Используем время из Docker 
-    Time_Keep   On 
- 
-# GitLab Registry логи 
-[PARSER] 
-    Name        gitlab_registry 
-    Format      regex 
-    Regex       ^\d{4}-\d{2}-\d{2}_\d{2}:\d{2}:\d{2}\.\d+ time="(?<time>[^"]*)" level=(?<level>\w+) msg="(?<msg>[^"]*)"(?<rest>.*) 
-    Time_Key    time 
-    Time_Format %Y-%m-%dT%H:%M:%S.%LZ 
-    Time_Keep   On 
- 
-# Sidekiq JSON логи 
-[PARSER] 
-    Name        sidekiq_json 
-    Format      json 
-    # Time_Key    time    # Используем время из Docker 
-    Time_Keep   On 
- 
-# Nextcloud Apache-style логи 
-[PARSER] 
-    Name        nextcloud_access 
-    Format      regex 
-    Regex       ^(?<remote_ip>[^ ]*) (?<user_ident>[^ ]*) (?<user_id>[^ ]*) \[(?<timestamp>[^\]]*)\] "(?<method>\w+) (?<path>[^ ]*) HTTP/[0-9.]+" (?<status>\d+) (?<body_bytes>\d+) "(?<referrer>[^"]*)" "(?<user_agent>[^"]*)" 
-    Time_Key    timestamp 
-    Time_Format %d/%b/%Y:%H:%M:%S %z  # ← Apache/Nginx формат! 
-    Time_Keep   On 
- 
-# Apache access логи 
-[PARSER] 
-    Name        apache_access 
-    Format      regex 
-    Regex       ^(?<remote_ip>[^ ]*) - - \[(?<timestamp>[^\]]*)\] "(?<method>\w+) (?<path>[^ ]*) HTTP/[0-9.]+" (?<status>\d+) (?<body_bytes>\d+) "(?<referrer>[^"]*)" "(?<user_agent>[^"]*)" 
-    Time_Key    timestamp 
-    Time_Format %d/%b/%Y:%H:%M:%S %z 
- 
-# MySQL error логи 
-[PARSER] 
-    Name        mysql_error 
-    Format      regex 
-    Regex       ^(?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+Z) (?<level>\w+) (?<message>.*) 
-    Time_Key    timestamp 
-    Time_Format %Y-%m-%dT%H:%M:%S.%LZ 
-    Time_Keep   On 
- 
-# MySQL slow query логи 
-[PARSER] 
-    Name        mysql_slow 
-    Format      regex 
-    Regex       ^# Time: (?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+Z).*# User@Host: (?<user>[^\[]*)\[(?<database>[^\]]*)\] @ (?<host>[\w\.]*)\s*\[(?<ip>[\d\.]*)\].*# Query_time: (?<query_time>[\d\.]*) Lock_time: (?<lock_time>[\d\.]*) Rows_sent: (?<rows_sent>\d*) Rows_examined: (?<rows_examined>\d*).*use (?<used_database>\w*);.*SET timestamp=(?<timestamp_unix>\d*);(?<query>.*) 
-    Time_Key    timestamp 
-    Time_Format %Y-%m-%dT%H:%M:%S.%LZ 
-    Time_Keep   On 
- 
-# PostgreSQL логи 
-[PARSER] 
-    Name        postgresql 
-    Format      regex 
-    Regex       ^(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d+ [A-Z]{3}) \[(?<pid>\d+)\] (?<level>\w+):\s*(?<message>.*) 
-    Time_Key    timestamp 
-    Time_Format %Y-%m-%d %H:%M:%S.%L %Z 
-    Time_Keep   On 
- 
-# PostgreSQL extended логи (с деталями запросов) 
-[PARSER] 
-    Name        postgresql_detailed 
-    Format      regex 
-    Regex       ^(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d+ [A-Z]{3}) \[(?<pid>\d+)\] (?<level>\w+):\s*duration: (?<duration>[\d\.]*) ms\s*(?<message>.*) 
-    Time_Key    timestamp 
-    Time_Format %Y-%m-%d %H:%M:%S.%L %Z 
-    Time_Keep   On 
- 
-# PHP-FPM логи 
-[PARSER] 
-    Name        php_fpm 
-    Format      regex 
-    Regex       ^\[(?<timestamp>[^\]]+)\] (?<level>\w+): (?<message>.*) 
-    Time_Key    timestamp 
-    Time_Format %d-%b-%Y %H:%M:%S 
-    Time_Keep   On 
- 
-# Стандартный syslog 
-[PARSER] 
-    Name        syslog_rfc3164 
-    Format      regex 
-    Regex       ^\<(?<pri>[0-9]+)\>(?<timestamp>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? (?<message>.*)$ 
-    Time_Key    timestamp 
-    Time_Format %b %d %H:%M:%S 
-    Time_Keep   On 
- 
-# Grafana лог формата key=value 
-[PARSER] 
-    Name        grafana_logfmt 
-    Format      logfmt 
-    Time_Key    t 
-    Time_Format %Y-%m-%dT%H:%M:%S.%LZ 
-    Time_Keep   On 
- 
-[PARSER] 
-    Name        grafana_regex 
-    Format      regex 
-    Regex       logger=(?<logger>[^ ]*) endpoint=(?<endpoint>[^ ]*) pluginId=(?<pluginId>[^ ]*) dsName=(?<dsName>[^ ]*) dsUID=(?<dsUID>[^ ]*) uname=(?<uname>[^ ]*) t=(?<t>[^ ]*) level=(?<level>[^ ]*) msg="(?<msg>[^"]*)" error=(?<error>[^ ]*) statusCode=(?<statusCode>[^ ]*) resourcePath="(?<resourcePath>[^"]*)" 
-    Time_Key    t 
-    Time_Format %Y-%m-%dT%H:%M:%S.%LZ 
-    Time_Keep   On 
-</code> 
- 
-=== Установка === 
- 
-<code bash> 
- 
-</code> 
  
 === loki_config === === loki_config ===
Строка 526: Строка 417:
 </code> </code>
  
-=== Развертывание ===+==== Развертывание ====
  
 <code bash> <code bash>
 +version: "3.8"
 +
 +x-logging: &default-logging
 +  driver: "json-file"
 +  options:
 +    max-size: "10m"
 +    max-file: "3"
 +    tag: "{{.Name}}/{{.ImageName}}"
 +
 +x-labels: &default-labels
 +  logging: "enabled"
 +  logging_jobname: "docker_swarm"
 +  monitoring: "true"
 +
 +services:
 +  loki:
 +    image: grafana/loki:3.5.8
 +    ports:
 +      - "3100:3100"
 +    configs:
 +      - source: loki_config
 +        target: /etc/loki/local-config.yaml
 +    volumes:
 +      - loki_data:/loki
 +    command: -config.file=/etc/loki/local-config.yaml
 +    networks:
 +      - monitoring
 +    deploy:
 +      placement:
 +        constraints:
 +          - node.role == manager
 +    logging: *default-logging
 +    labels:
 +      <<: *default-labels
 +      service: "loki"
 +      component: "logging"
 +
 +  fluent-bit:
 +    image: fluent/fluent-bit:4.2.0
 +    configs:
 +      - source: fluent_bit_config
 +        target: /fluent-bit/etc/fluent-bit.conf
 +      - source: fluent_bit_parser
 +        target: /fluent-bit/etc/parsers.conf
 +      - source: docker_metadata
 +        target: /fluent-bit/bin/docker-metadata.lua
 +    environment:
 +      - NODE_ID={{.Node.ID}}
 +      - NODE_NAME={{.Node.Hostname}}
 +    ports:
 +      - "5140:5140/tcp"  # Для приема syslog от роутера
 +      - "2020:2020"      # HTTP мониторинг Fluent Bit
 +    networks:
 +      - monitoring
 +    volumes:
 +      - flb_storage:/var/log/flb-storage/
 +      - /var/lib/docker/containers:/var/lib/docker/containers:ro
 +    deploy:
 +      mode: global
 +
 +
 +  grafana:
 +    image: grafana/grafana:12.1.4
 +    ports:
 +      - "3000:3000"
 +    environment:
 +      - GF_SECURITY_ADMIN_PASSWORD=admin
 +      - GF_SECURITY_ADMIN_USER=admin
 +    volumes:
 +      - grafana_data:/var/lib/grafana
 +    networks:
 +      - monitoring
 +    deploy:
 +      placement:
 +        constraints:
 +          - node.role == manager
 +    logging: *default-logging
 +    labels:
 +      <<: *default-labels
 +      service: "grafana"
 +      component: "monitoring"
 +
 +configs:
 +  loki_config:
 +    external: true
 +  fluent_bit_config:
 +    external: true
 +  fluent_bit_parser:
 +    external: true
 +  docker_metadata:
 +    external: true
 +
 +networks:
 +  monitoring:
 +    driver: overlay
  
 +volumes:
 +  flb_storage:
 +    driver: local
 +  loki_data:
 +    driver: local
 +  grafana_data:
 +    driver: local
 </code> </code>
  
-=== Проверка работы ===+==== Проверка работы ====
  
 <code bash> <code bash>