菜单
开源

使用 Grafana Alloy 处理日志

本教程假设您熟悉如何设置和连接组件。它介绍了如何使用 loki.source.api 通过 HTTP 接收日志,对其进行处理和过滤,然后将其发送到 Loki。

开始之前

完成本教程需要

通过 HTTP 接收和处理日志

`loki.source.api` 组件可以通过 HTTP 接收日志。它可以用来接收来自其他 Alloy 或收集器的日志,或者直接接收来自能通过 HTTP 发送日志的应用程序的日志,然后在中心位置对其进行处理。

设置 `loki.source.api` 组件

您的管线将如下所示

An example logs pipeline

首先设置 `loki.source.api` 组件

alloy
loki.source.api "listener" {
    http {
        listen_address = "127.0.0.1"
        listen_port    = 9999
    }

    labels = { source = "api" }

    forward_to = [loki.process.process_logs.receiver]
}

这是一个简单的配置。您配置 `loki.source.api` 组件监听 `127.0.0.1:9999`,并为接收到的日志条目附加 `source="api"` 标签,然后将这些条目转发到 `loki.process.process_logs` 组件的导出接收器。

处理并写入日志

配置 `loki.process` 和 `loki.write` 组件

现在您已经设置了 `loki.source.api` 组件,可以配置 `loki.process` 和 `loki.write` 组件了。

alloy
// Let's send and process more logs!

loki.source.api "listener" {
    http {
        listen_address = "127.0.0.1"
        listen_port    = 9999
    }

    labels = { "source" = "api" }

    forward_to = [loki.process.process_logs.receiver]
}

loki.process "process_logs" {

    // Stage 1
    stage.json {
        expressions = {
            log = "",
            ts  = "timestamp",
        }
    }

    // Stage 2
    stage.timestamp {
        source = "ts"
        format = "RFC3339"
    }

    // Stage 3
    stage.json {
        source = "log"

        expressions = {
            is_secret = "",
            level     = "",
            log_line  = "message",
        }
    }

    // Stage 4
    stage.drop {
        source = "is_secret"
        value  = "true"
    }

    // Stage 5
    stage.labels {
        values = {
            level = "",
        }
    }

    // Stage 6
    stage.output {
        source = "log_line"
    }

    // This stage adds static values to the labels on the log line
    stage.static_labels {
        values = {
            source = "demo-api",
        }
    }

    forward_to = [loki.write.local_loki.receiver]
}

loki.write "local_loki" {
    endpoint {
        url = "https://:3100/loki/api/v1/push"
    }
}

整合所有部分

现在您已经准备好所有部分,可以运行 Alloy 并向其发送一些日志了。使用上一个示例中的配置修改 `config.alloy`,然后使用以下命令启动 Alloy

bash
<BINARY_FILE_PATH> run config.alloy

替换以下内容

  • *``*: Alloy 可执行文件的路径。

尝试执行以下命令,它将插入当前时间戳

bash
curl localhost:9999/loki/api/v1/raw -XPOST -H "Content-Type: application/json" -d '{"log": {"is_secret": "false", "level": "debug", "message": "This is a debug message!"}, "timestamp":  "'"$(date -u +"%Y-%m-%dT%H:%M:%SZ")"'"}'

现在您已经发送了一些日志,是时候看看它们在 Grafana 中是什么样子了。导航到 https://:3000/explore 并将数据源切换到 `Loki`。尝试查询 `{source="demo-api"}`,看看是否能找到您发送的日志。

尝试修改 `"level"`、`"message"`、`"timestamp"` 和 `"is_secret"` 的值,看看日志如何变化。您还可以尝试向 `loki.process` 组件添加更多阶段,以从日志中提取更多值,或者添加更多标签。

Example Loki Logs

练习

既然您已经在用 Docker 并且 Docker 会导出日志,您可以将这些日志发送到 Loki。有关更多信息,请参阅 [`discovery.docker`](../../reference/components/discovery/discovery.docker/) 和 [`loki.source.docker`](../../reference/components/loki/loki.source.docker/) 文档。

为了确保正确的时间戳和其他标签,请务必在使用 `loki.process` 组件处理日志后再将其发送到 Loki。

尽管您之前没有使用过 `discovery.relabel` 组件,但您可以使用它将容器名称作为标签附加到日志中。有关更多信息,请参阅 [`discovery.relabel`](../../reference/components/discovery/discovery.relabel/) 文档。`discovery.relabel` 组件与 `prometheus.relabel` 组件非常相似,但它重命名的是发现的目标,而不是指标。