【问题标题】:Send logs directly to Loki without use of agents不使用代理直接将日志发送到 Loki
【发布时间】:2021-07-22 18:32:16
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: api prometheus grafana grafana-api grafana-loki


    【解决方案1】:

    Loki HTTP API

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

    POST /loki/api/v1/push

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

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

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

    您可以设置 Content-Encoding: gzip 请求标头并发布 gzipped 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。

    some libraries 实现了几个 Grafana Loki 协议。

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

    安全

    Above API 不支持here 所写的任何访问限制 - 在公共网络上使用时,请考虑例如从CertbotBasic Authentication 使用HTTPS 配置Nginx 代理。

    【讨论】:

      【解决方案2】:

      是的。您可以直接从 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 2014-08-29
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        • 2021-12-10
        相关资源
        最近更新 更多