Skip to content

使用ALG收集监控日志文件示例

ALG(Alloy + Loki + Grafana)现代轻量级的日志管理解决方案

Alloy配置文件示例

text
config.alloy
local.file_match "local_files" {
    path_targets = [
        {
            "__path__" = "/usr/crm/logs/*.log", 
            "host" = "10.1.56.207",
            "app" = "crm",
            "env" = "prod",
        },
        {
            "__path__" = "/usr/oa/logs/*.log", 
            "host" = "10.1.56.207",
            "app" = "oa",
            "env" = "prod",
        },
    ]
    sync_period = "5s"
}

loki.source.file "log_scrape" {
    targets    = local.file_match.local_files.targets
    forward_to =  [loki.write.grafana_loki.receiver]
    tail_from_end = true
}

loki.write "grafana_loki" {
    endpoint {
        url = "http://loki:3100/loki/api/v1/push"
        // basic_auth {
        //  username = "admin"
        //  password = "admin"
        // }
    }
}

Alloy配置文件讲解说明

配置文件解析

1. 文件目标定义 (local.file_match)

local.file_match "local_files" {
    path_targets = [
        {
            "__path__" = "/usr/crm/logs/*.log", 
            "host" = "10.1.56.207",
            "app" = "crm",
            "env" = "prod",
        },
        {
            "__path__" = "/usr/oa/logs/*.log", 
            "host" = "10.1.56.207",
            "app" = "oa",
            "env" = "prod",
        },
    ]
    sync_period = "5s"
}
  • 作用:动态发现需要监控的日志文件
  • 关键配置项
    • path_targets:定义文件路径和标签
      • __path__:使用通配符匹配日志文件(支持***递归匹配)
      • hostappenv:自定义设置日志来源标识(Loki查询时的重要标签)
    • sync_period:文件系统同步间隔(默认30s)

2. 日志收集配置 (loki.source.file)

loki.source.file "log_scrape" {
    targets = local.file_match.local_files.targets
    forward_to = [loki.write.grafana_loki.receiver]
    tail_from_end = true
}
  • 作用:持续跟踪并收集日志文件内容
  • 关键配置项
    • targets:引用前边定义的文件匹配结果
    • forward_to:指定日志处理器(可多个)
    • tail_from_end:控制在没有找到已存储的读取位置(positions file)时,是否从日志文件的末尾开始读取日志
      • true:组件会忽略日志文件中已有的内容,只读取新追加的日志行。这对于处理大型日志文件时非常有用,可以避免一开始就读取全部历史内容,只关注后续新增的日志
      • false(默认值):组件会从文件的开头开始读取所有内容,包括历史日志。

3. Loki写入配置 (loki.write)

loki.write "grafana_loki" {
    endpoint {
        url = "http://loki:3100/loki/api/v1/push"
        // basic_auth {
        //   username = "admin"
        //   password = "admin"
        // }
    }
}
  • 作用:配置日志存储后端
  • 关键配置项
    • url:Loki服务地址(支持HTTPS)
    • basic_auth:基础认证配置(按需启用)

配置注意事项

  1. 路径匹配

    • *.log 匹配同级目录所有.log文件
    • **/logs/ 递归匹配所有子目录中的logs目录
    • 使用绝对路径保证可靠性
  2. 标签设计

    • 最少但具有区分度的标签组合
    • 避免高频变化的标签值(如时间戳)
    • 推荐标签:job, env, team, cluster
  3. 性能调优

    • 生产环境建议 sync_period ≥ 1m
    • 大日志文件(>100MB)建议增加 read_buffer_size
    • 高负载时调整 max_concurrent_tails
  4. 安全配置

    endpoint {
        url = "https://loki.secure.com"
        bearer_token = "xxxxxx"
        tls_config {
            ca_file = "/path/to/ca.crt"
            insecure_skip_verify = false
        }
    }

Loki配置文件示例

text
loki-config.yaml
yaml

# auth_enabled: false  # 禁用认证模块(生产环境不建议关闭)
auth_enabled: false

# 服务端配置
server:
  http_listen_port: 3100            # HTTP API 监听端口(查询/写入接口)
  grpc_listen_port: 9096            # gRPC 通信端口(组件间通信)
  log_level: info                   # 服务日志级别
  grpc_server_max_concurrent_streams: 1000  # gRPC 最大并发流数

# 公共配置
common:
  instance_addr: 127.0.0.1          # 实例对外地址(集群部署需改为实际IP)
  path_prefix: /home/loki/data      # 数据存储根目录
  storage:
    filesystem:
      chunks_directory: /home/loki/data/chunks  # 块数据存储路径
      rules_directory: /home/loki/data/rules    # 告警规则存储路径
  replication_factor: 1             # 数据副本数(单机模式为1)
  ring:                             # 一致性哈希环配置
    kvstore:
      store: inmemory               # 使用内存存储哈希环(集群需改为 consul 等)

# 查询范围缓存
query_range:
  results_cache:
    cache:
      embedded_cache:               # 嵌入式查询结果缓存
        enabled: true               # 启用缓存
        max_size_mb: 100            # 最大缓存容量 100MB

# 运行时限制配置
limits_config:
  metric_aggregation_enabled: true   # 启用指标聚合
  allow_structured_metadata: true    # 允许结构化元数据
  volume_enabled: true               # 启用日志体积统计
  retention_period: 720h             # 日志保留周期(30天)

# 存储架构配置
schema_config:
  configs:
    - from: 2020-10-24              # 配置生效起始时间
      store: tsdb                   # 使用 TSDB 存储引擎(v2.4+)
      object_store: filesystem      # 对象存储类型(本地文件系统)
      schema: v13                   # 架构版本
      index:
        prefix: index_             # 索引文件前缀
        period: 24h                 # 索引分片周期

# 模式分析模块
pattern_ingester:
  enabled: true                     # 启用日志模式分析功能
  metric_aggregation:
    loki_address: localhost:3100    # 指标聚合服务地址

# 告警规则引擎
ruler:
  enable_alertmanager_discovery: true  # 自动发现 Alertmanager
  enable_api: true                   # 启用规则管理 API

# 查询前端配置
frontend:
  encoding: protobuf                # 查询结果使用 Protobuf 编码

# 压缩与清理
compactor:
  working_directory: /home/loki/data/retention  # 清理工作目录
  delete_request_store: filesystem  # 删除请求存储方式
  retention_enabled: true           # 启用自动数据清理

docker-compose.yml

text
docker-compose.yml
yaml

services:
  alloy:
    image: grafana/alloy:v1.7.5
    ports:
      - 12345:12345
      - 4317:4317
      - 4318:4318
    volumes:
      - ./alloy-data:/var/lib/alloy/data
      - ./config.alloy:/etc/alloy/config.alloy
      - /usr/local/app/logs:/usr/local/app/logs # 宿主机要监听的日志挂载到alloy容器中
    command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy
    depends_on:
      - loki
    networks:
      - loki
  loki:
    image: grafana/loki:3.4.2
    ports:
      - "3100:3100"
    volumes:
      - ./loki-config.yaml:/etc/loki/local-config.yaml
      # 挂载loki数据
      - ./loki-data:/home/loki/data
    command: -config.file=/etc/loki/local-config.yaml
    privileged: true 
    networks:
      - loki
  grafana:
    image: grafana/grafana:11.6.0
    environment:
      # 允许匿名访问并设置管理员权限
      # - GF_FEATURE_TOGGLES_ENABLE=grafanaManagedRecordingRules
      # - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      # - GF_AUTH_ANONYMOUS_ENABLED=true
      # - GF_AUTH_BASIC_ENABLED=false
      
      # 设置grafana的管理员账号和密码
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=YourStrongPassword123!
      - GF_AUTH_ANONYMOUS_ENABLED=false  # 禁用匿名访问
    ports:
      - 3000:3000/tcp
    volumes:
      - ./grafana.ini:/etc/grafana/grafana.ini
      - ./grafana-data:/var/lib/grafana
    entrypoint:
       - sh
       - -euc
       - |
         mkdir -p /etc/grafana/provisioning/datasources
         cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
         apiVersion: 1
         datasources:
         - name: Loki
           type: loki
           access: proxy
           orgId: 1
           url: 'http://loki:3100'
           basicAuth: false
           isDefault: true
           version: 1
           editable: true 
         EOF
         /run.sh
    networks:
      - loki
    
networks:
    loki:

注意事项

  • 提前创建alloy-data、loki-data、grafana-data目录并赋予777权限

启动服务

bash
docker-compose up -d

访问grafana

http://localhost:3000 - Explore -> 选择数据源 -> Label browser -> 输入 app=crm -> 点击 Run query

即可查看到日志信息

/src/technology/dateblog/2025/05/20250526-%E4%BD%BF%E7%94%A8alg%E7%9B%91%E6%8E%A7%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%97%A5%E5%BF%97%E7%A4%BA%E4%BE%8B.html