Logback 附加程序 (Loki4jAppender) 不向 Loki 发送日志

问题描述 投票:0回答:1

我正在尝试在 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>

有人有想法吗?

logback grafana-loki
1个回答
0
投票
  1. Loki4j 是异步客户端,这意味着日志消息到达后不会立即一一发送给 Loki。相反,Loki4j 会分批累积它们,并仅在批次完成时才发送。默认情况下,如果包含 1000 条消息,或者保留 1 分钟,则批处理完成。如果您想发送一些测试消息并立即查看结果,可以将

    batchMaxItems
    设置为 1。但请不要忘记将此设置更改回现实生活中的生产日志记录。

  2. 请不要使用单元测试进行评估。相反,为主代码打开 Loki4j 附加程序。可能是您的 logback 配置没有被选择用于测试,或者测试 jvm 进程在 Loki4j 设法发送任何内容之前被终止,等等。如果您想定期测试 Loki4j(我打赌您并不真正想要),您需要 集成测试 而不是单元测试。

© www.soinside.com 2019 - 2024. All rights reserved.