0

有没有办法直接将日志发送到 Loki 而无需使用其中一个代理?

例如,如果我有一个 API,是否可以从 API 直接向 Loki 发送请求/响应日志,而不受 Promtail 等的干扰?

提前致谢!

4

2 回答 2

2

洛基 HTTP API

Loki HTTP API允许将消息直接推送到 Grafana Loki 服务器:

发布 /loki/api/v1/push

/loki/api/v1/push 是用于向 Loki 发送日志条目的端点。POST 正文的默认行为是快速压缩的 protobuf 消息:

或者,如果 Content-Type 标头设置为application/json,则可以按以下格式发送JSON 帖子正文:

{
  "streams": [
    {
      "stream": {
        "label": "value"
      },
      "values": [
          [ "<unix epoch in nanoseconds>", "<log line>" ],
          [ "<unix epoch in nanoseconds>", "<log line>" ]
      ]
    }
  ]
}

您可以设置 Content-Encoding: gzip 请求标头并发布 gzip 压缩的 JSON。

例子:

curl -v -H "Content-Type: application/json" -XPOST -s "http://localhost:3100/loki/api/v1/push" --data-raw \
 '{"streams": [{ "stream": { "foo": "bar2" }, "values": [ [ "1570818238000000000", "fizzbuzz" ] ] }]}'

因此很容易创建带有日志的 JSON 格式的字符串并将其发送到 Grafana Loki。

图书馆

一些库实现了几个 Grafana Loki 协议。

纯 Java 1.8 中还有(我的)零依赖库,它实现了将 JSON 格式的日志推送到 Grafana Loki。适用于 Java SE 和 Android 平台:

安全

以上 API 不支持此处所写的任何访问限制- 通过公共网络使用时,请考虑使用来自Certbot的 HTTPS和Basic Authentication配置 Nginx 代理。

于 2021-11-05T17:17:03.080 回答
1

是的。您可以将日志直接从 Java 应用程序发送到 loki。

可以使用 java springboot 项目中的 loki4j 配置来完成。将以下依赖项添加到 pom.xml

    <dependency>
        <groupId>com.github.loki4j</groupId>
        <artifactId>loki-logback-appender</artifactId>
        <version>1.2.0</version>
    </dependency>

根据您在系统上安装 loki 的方式,直接或从 docker 运行 loki。我使用 loki 和 grafana 的 docker 实例。

在你的springboot项目中创建一个logback.xml,内容如下

    <property name="HOME_LOG" value="app.log" />

    <appender name="FILE-ROLLING"
        class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http://localhost:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>app=my-app,host=${HOSTNAME},level=%level</pattern>
            </label>
            <message>
                <pattern>l=%level h=${HOSTNAME} c=%logger{20} t=%thread | %msg %ex
                </pattern>
            </message>
            <sortByTime>true</sortByTime>
        </format>
    </appender>

    <logger name="com.vasanth.loki" level="debug" additivity="false">
        <appender-ref ref="FILE-ROLLING" />
    </logger>

    <root level="error">
        <appender-ref ref="FILE-ROLLING" />
    </root>

</configuration>

在上面的示例中配置您的记录器名称,并确保您提供了正确的 loki URL - 您基本上是在告诉应用程序将日志写入直接到 loki URL 的输出流,而不是通过传统方式将日志写入文件log4j 配置,然后使用 promtail 获取这些日志并加载到 loki。

于 2021-08-16T11:56:06.973 回答