alloy 配置解析

alloy 配置解析

// ============================================
// 全局配置
// ============================================

logging {
  level = "info"   // 设置 Alloy 自身日志级别为 info,用于日常监控和问题排查
}

// ============================================
// 本地 Loki 输出(全量日志)
// ============================================

loki.write "local" {
  endpoint {
    url = "http://192.168.2.32:3100/loki/api/v1/push"   // 本地 Loki 的 API 地址

    batch_size  = "512KiB"   // 每批日志大小上限 512KB,达到后立即发送
    batch_wait = "5s"        // 最多等待 5 秒,即使未满也会发送

    min_backoff_period = "500ms"   // 发送失败后首次重试等待 0.5 秒
    max_backoff_period = "15s"     // 重试间隔最大 15 秒(指数退避)
    max_backoff_retries = 10       // 最多重试 10 次,之后丢弃
  }
}

// ============================================
// 远程 Loki 输出 - 全量日志(租户 puxian)
// ============================================

loki.write "remote" {
  endpoint {
    url = "https://loki-central.alex.com/loki/api/v1/push"   // 远端中央 Loki 地址
    tenant_id = "puxian"   // Loki 多租户模式下的租户 ID

    batch_size = "256KiB"   // 每批 256KB(网络传输比本地更保守)
    batch_wait = "10s"      // 等待 10 秒(减少网络请求次数)

    min_backoff_period = "1s"    // 重试起始等待 1 秒
    max_backoff_period = "60s"   // 重试最大等待 60 秒
    max_backoff_retries = 10
  }
}

// ============================================
// 远程 Loki 输出 - 仅错误日志(租户 huilai)
// ============================================

loki.write "error_remote" {
  endpoint {
    url = "https://loki-central.alex.com/loki/api/v1/push"   // 同远端地址
    tenant_id = "huilai"   // 不同租户 ID,用于隔离错误日志

    batch_size = "256KiB"
    batch_wait = "10s"

    min_backoff_period = "1s"
    max_backoff_period = "60s"
    max_backoff_retries = 10
  }
}

// ============================================
// 错误日志过滤器:只保留 ERROR/SEVERE/FATAL 级别的日志
// ============================================

loki.process "error_filter" {
  // 处理后的日志发送到 error_remote 输出组件
  forward_to = [loki.write.error_remote.receiver]

  // match 阶段:匹配条件满足时执行指定动作
  stage.match {
    // selector: LogQL 标签选择器 + 过滤表达式
    // {project=~".+"}   → 只处理带有 project 标签的日志
    // !~ "... "         → 不匹配以下正则表达式的日志
    // (?i)              → 不区分大小写
    // ERROR|SEVERE|FATAL → 匹配这三种级别
    // 整体含义:如果日志内容不包含 ERROR/SEVERE/FATAL,则执行 drop
    selector = "{project=~\".+\"} !~ \"(?i)(ERROR|SEVERE|FATAL)\""
    
    action = "drop"   // 丢弃匹配到的日志(即非错误日志被丢弃,错误日志被保留)
  }
}

// ============================================
// Bootstrap 应用的日志采集配置
// ============================================

// 1. 文件发现:定义要监控哪些日志文件
local.file_match "bootstrap" {
  path_targets = [
    {
      __path__  = "/data/logs/bootstrap/*.log",    // 匹配该目录下所有 .log 文件
      // ========== 以下为自定义标签,会附加到每条日志上 ==========
      project   = "project-huilai",   // 项目名称
      product   = "aiboche",          // 产品名称
      logtype   = "app",              // 日志类型(应用日志)
      ipaddr    = "192.168.0.18",     // 服务器 IP
      host      = "host-192-168-0-18",// 主机名
      app       = "bootstrap",        // 应用名称
    },
    {
      __path__  = "/data/logs/bootstrap/**/*.log",  // ** 递归匹配所有子目录下的 .log 文件
      // 标签与上面完全相同
      project   = "project-huilai",
      product   = "aiboche",
      logtype   = "app",
      ipaddr    = "192.168.0.18",
      host      = "host-192-168-0-18",
      app       = "bootstrap",
    },
  ]
}

// 2. 标签重写:过滤掉不需要的日志文件
discovery.relabel "bootstrap" {
  // 从 local.file_match 获取发现的所有文件目标
  targets = local.file_match.bootstrap.targets

  // 规则:如果文件路径包含 "catalina",则丢弃该目标
  rule {
    source_labels = ["__path__"]   // 从文件路径标签取值
    regex         = ".*catalina.*" // 匹配包含 catalina 的路径(Tomcat 日志)
    action        = "drop"         // 丢弃匹配到的目标,不采集这些文件
  }
}

// 3. 日志读取:实际读取文件内容
loki.source.file "bootstrap" {
  // 使用经过 relabel 过滤后的目标列表
  targets = discovery.relabel.bootstrap.output
  
  // 关键:日志处理完成后发送到 bootstrap 处理组件
  forward_to = [loki.process.bootstrap.receiver]
  
  tail_from_end = true   // 从文件末尾开始读取,不读历史内容

  // 记录文件读取进度的位置文件路径(防止重启后重复读取)
  legacy_positions_file = "/tmp/alloy-positions-bootstrap.yaml"
}

// 4. 日志处理/分发:决定日志流向哪里
loki.process "bootstrap" {
  // 收到的日志同时发给三个下游:
  forward_to = [
    loki.write.local.receiver,        // ① 本地 Loki(全量)
    loki.write.remote.receiver,       // ② 远端 Loki 租户 puxian(全量)
    loki.process.error_filter.receiver, // ③ 错误日志过滤器(仅错误会继续流向 error_remote)
  ]
}
posted @ 2026-05-06 18:04  liwenchao1995  阅读(42)  评论(0)    收藏  举报