在本指南中,我们将设置一个OpenTelemetry收集器,收集日志并将其发送到Grafana云中运行的Grafana Loki。
我们将考虑两个通过OpenTelemetry Collector向Loki发送日志的例子。第一个例子展示了如何用Fluent Forward接收器收集容器日志。第二个例子展示了如何使用Filelog接收器来收集系统日志。
前提条件
在我们开始之前,我们需要运行Grafana Loki和Grafana。你可以自己下载并运行Loki和Grafana,或者你可以使用Grafana云,它有一个慷慨的永久免费层,以及适合各种使用情况的计划,你今天就可以注册了。在本指南中,我们将使用Grafana Cloud。
设置Grafana Cloud账户
如果你已经有一个Grafana Cloud账户,请登录,或者注册一个免费账户。
打开grafana.com/,点击我的账户。向下滚动到管理你的Grafana Cloud Stack部分。找到Loki块,点击发送日志按钮:

向下滚动到从独立主机发送日志的部分。点击 "现在生成"链接,生成你的API密钥:

你会看到一个弹出式的创建API密钥表格。输入密钥名称,从选择框中选择Metrics Publisher角色。API密钥生成后,配置样本中的客户端URL将被修改。适当的API Key将替代tring。复制网址https://:@logs-prod-eu-west-0.grafana.net/loki/api/v1/push 。我们稍后将在OpenTelemetry Collector的配置文件中使用它。
下载OpenTelemetry Collector的最新版本
你可以在GitHub上下载大多数架构/操作系统的二进制文件,如果有的话,可以下载v0.49.0或更高版本。
在本指南中,我以Mac OS为例:
$ wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.49.0/otelcol-contrib_0.49.0_darwin_amd64.tar.gz
$ gunzip -c otelcol-contrib_0.49.0_darwin_amd64.tar.gz | tar xopf -
这个接收器运行一个TCP服务器,通过Fluent Forward协议接受事件。在这个例子中,我们将从Docker容器中收集日志并将其发送到Grafana Loki。
准备OpenTelemetry采集器的配置文件
创建config.yaml文件:
receivers:
fluentforward:
endpoint: 127.0.0.1:24224
processors:
batch:
exporters:
logging:
logLevel: debug
loki:
endpoint: "https://:@logs-prod-eu-west-0.grafana.net/loki/api/v1/push"
tenant_id: "example1"
labels:
attributes:
container_name: ""
container_id: ""
service:
pipelines:
logs:
receivers: [fluentforward]
processors: [batch]
exporters: [logging, loki]
属性container_name 和container_id 是有效的Loki标签,这就是为什么不需要映射,我们可以留下空字符串。然后运行:
$ ./otelcol-contrib --config ./config.yaml
现在OpenTelemetry Collector正在运行。
设置Docker容器来发送日志到Grafana Loki
让我们在Docker容器中运行Ubuntu镜像,它将每秒产生日志到stdout。
对于Mac OS和Windows:
$ docker run --rm --log-driver=fluentd --log-opt fluentd-address=host.docker.internal:24224 ubuntu sh -c "while true; do echo Hi Loki \$(date); sleep 1; done"
现在你可以在Grafana云中打开Grafana,进入探索,选择Loki,然后看到日志。

Filelog接收器尾随并解析文件中的日志。在这个例子中,我们将尾随系统日志并将其发送到Grafana Loki。
准备OpenTelemetry采集器的配置文件
创建config.yaml文件:
receivers:
filelog:
include: [/var/log/*.log]
processors:
batch:
exporters:
logging:
logLevel: debug
loki:
endpoint: "https://:@logs-prod-eu-west-0.grafana.net/loki/api/v1/push"
tenant_id: "example2"
labels:
attributes:
log.file.name: "filename"
service:
pipelines:
logs:
receivers: [filelog]
processors: [batch]
exporters: [logging, loki]
我们在这里指定了属性映射log.file.name: "filename" 。因为Loki只接受与^\[a-zA-Z_]*$ ,我们需要提供从记录属性名称到Loki标签的映射。它可以是任何符合重码的字符串。我选择了"filename" 。
然后运行:
$ ./otelcol-contrib --config ./config.yaml
现在你可以在Grafana云中打开Grafana,进入探索,选择Loki,并看到日志。
OpenTelemetry收集器可以使用一个以上的接收器。有两个接收器的配置将看起来像:
receivers:
filelog:
include: [/var/log/*.log]
fluentforward:
endpoint: 127.0.0.1:24224
processors:
batch:
exporters:
logging:
logLevel: debug
loki:
endpoint: "https://:@logs-prod-eu-west-0.grafana.net/loki/api/v1/push"
tenant_id: "example2"
labels:
attributes:
log.file.name: "filename"
container_id: "",
container_name: ""
service:
pipelines:
logs:
receivers: [filelog, fluentforward]
processors: [batch]
exporters: [logging, loki]
然后运行:
$ ./otelcol-contrib --config ./config.yaml
现在你可以在云端打开Grafana,进入探索,选择Loki,并看到来自Fluent Forward和Filelog接收器的日志。
总结
在本指南中,我们提供了配置OpenTelemetry收集器所需的所有步骤,以便通过Fluent Forward和Filelog接收器收集容器日志和系统日志,并将它们发送到Grafana云中的Grafana Loki。