不使用代理直接将日志发送到 Loki
Send logs directly to Loki without use of agents
有没有一种方法可以直接将日志发送到 Loki 而无需使用其中一个代理?
例如,如果我有一个 API,是否可以将 request/response 日志从 API 直接发送到 Loki,而不受例如 Promtail 的干扰?
提前致谢!
是的。您可以将日志直接从 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 的方式。我使用 docker 个 loki 和 grafana 实例。
在你的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 中的传统方式。
Loki HTTP API
Loki HTTP API 允许将消息直接推送到 Grafana Loki 服务器:
POST /loki/api/v1/push
/loki/api/v1/push is the endpoint used to send log entries to Loki.
The default behavior is for the POST body to be a snappy-compressed
protobuf message:
Alternatively, if the Content-Type header is set to application/json,
a JSON post body can be sent in the following format:
{
"streams": [
{
"stream": {
"label": "value"
},
"values": [
[ "<unix epoch in nanoseconds>", "<log line>" ],
[ "<unix epoch in nanoseconds>", "<log line>" ]
]
}
]
}
You can set Content-Encoding: gzip request header and post gzipped
JSON.
Example:
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 协议。
pureJava1.8中还有(我的)零依赖库,实现了将JSON格式的日志推送到Grafana Loki。适用于 Java SE 和 Android 平台:
安全
以上 API 不支持所写的任何访问限制 here - when using over public network, consider e.g. configuring Nginx proxy with HTTPS from Certbot and Basic Authentication。
有没有一种方法可以直接将日志发送到 Loki 而无需使用其中一个代理?
例如,如果我有一个 API,是否可以将 request/response 日志从 API 直接发送到 Loki,而不受例如 Promtail 的干扰?
提前致谢!
是的。您可以将日志直接从 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 的方式。我使用 docker 个 loki 和 grafana 实例。
在你的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 中的传统方式。
Loki HTTP API
Loki HTTP API 允许将消息直接推送到 Grafana Loki 服务器:
POST /loki/api/v1/push
/loki/api/v1/push is the endpoint used to send log entries to Loki. The default behavior is for the POST body to be a snappy-compressed protobuf message:
Alternatively, if the Content-Type header is set to application/json, a JSON post body can be sent in the following format:
{ "streams": [ { "stream": { "label": "value" }, "values": [ [ "<unix epoch in nanoseconds>", "<log line>" ], [ "<unix epoch in nanoseconds>", "<log line>" ] ] } ] }
You can set Content-Encoding: gzip request header and post gzipped JSON.
Example:
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 协议。
pureJava1.8中还有(我的)零依赖库,实现了将JSON格式的日志推送到Grafana Loki。适用于 Java SE 和 Android 平台:
安全
以上 API 不支持所写的任何访问限制 here - when using over public network, consider e.g. configuring Nginx proxy with HTTPS from Certbot and Basic Authentication。