我正在尝试在 Loki4jAppender (https://github.com/loki4j/loki-logback-appender) 的帮助下将日志发送到 Loki,但日志未到达目的地,并且我没有收到错误消息或一些提示,为什么它不起作用。
我尝试使用tinyloki(https://github.com/mjfryc/mjaron-tinyloki-java)并且效果很好。我在两者中使用了相同的配置,但不知何故 Logback 附加程序不起作用。
这是运行良好的 Tinyloki 代码:
LogController logController = TinyLoki
.withUrl("http://<ip>:<port>/loki/api/v1/push")
.start();
ILogStream stream = logController.stream() // Before v0.3.2 use createStream()
.info()
.l("host", "MyComputerName")
.l("customLabel", "custom_value")
.build();
stream.log("Hello world.");
logController.softStop().hardStop();
这是 Logback 配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>
<configuration>
<import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>
<import class="ch.qos.logback.core.ConsoleAppender"/>
<import class="com.github.loki4j.logback.Loki4jAppender"/>
<appender name="STDOUT" class="ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="LOKI" class="Loki4jAppender">
<http>
<url>http://<ip>:<port>/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>
<verbose>true</verbose>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="LOKI" />
</root>
</configuration>
Logback测试java源码:
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackToLokiTest {
Logger logger = LoggerFactory.getLogger(LogbackToLokiTest.class);
@Test
public void loggingTest() {
logger.info("Test log entry");
}
}
我想继续使用 Logback 而不是 Tinyloki,因为它有更多功能。
这些是 Maven 依赖项:
<dependency>
<groupId>io.github.mjfryc</groupId>
<artifactId>mjaron-tinyloki-java</artifactId>
<version>0.3.11</version>
</dependency>
<dependency>
<groupId>com.github.loki4j</groupId>
<artifactId>loki-logback-appender</artifactId>
<version>1.5.0-m1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.3.5</version>
</dependency>
有人有想法吗?
Loki4j 是异步客户端,这意味着日志消息到达后不会立即一一发送给 Loki。相反,Loki4j 会分批累积它们,并仅在批次完成时才发送。默认情况下,如果包含 1000 条消息,或者保留 1 分钟,则批处理完成。如果您想发送一些测试消息并立即查看结果,可以将
batchMaxItems
设置为 1。但请不要忘记将此设置更改回现实生活中的生产日志记录。
请不要使用单元测试进行评估。相反,为主代码打开 Loki4j 附加程序。可能是您的 logback 配置没有被选择用于测试,或者测试 jvm 进程在 Loki4j 设法发送任何内容之前被终止,等等。如果您想定期测试 Loki4j(我打赌您并不真正想要),您需要 集成测试 而不是单元测试。