Spring Boot中使用Loki日志

Grafana Labs 开发了Loki ,这是一个受Prometheus启发的开源日志聚合系统。其目的是存储和索引日志数据,以便于对不同应用程序和系统生成的日志进行高效查询和分析。

在本文中,我们将使用 Grafana Loki 为 Spring Boot 应用程序设置日志记录。 Loki 将收集并聚合应用程序日志,Grafana 将显示它们。

运行Loki和Grafana服务
我们将首先启动 Loki 和 Grafana 服务,以便我们可以收集和观察日志。Docker容器将帮助我们更轻松地配置和运行它们。

首先,让我们在docker-compose文件中编写 Loki 和 Grafana 服务:

version: "3"
networks:
  loki:
services:
  loki:
    image: grafana/loki:2.9.0
    ports:
      -
"3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki
  grafana:
    environment:
      - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
    entrypoint:
      - sh
      - -euc
      - |
        mkdir -p /etc/grafana/provisioning/datasources
        cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
        apiVersion: 1
        datasources:
        - name: Loki
          type: loki
          access: proxy
          orgId: 1
          url: http:
//loki:3100
          basicAuth: false
          isDefault: true
          version: 1
          editable: false
        EOF
        /run.sh
    image: grafana/grafana:latest
    ports:
      -
"3000:3000"
    networks:
      - loki

接下来,我们需要使用docker-compose命令启动服务:

docker-compose up

最后,我们确认一下这两个服务是否都已启动:

docker ps
211c526ea384        grafana/loki:2.9.0       "/usr/bin/loki -conf…"   4 days ago          Up 56 seconds       0.0.0.0:3100->3100/tcp   surajmishra_loki_1
a1b3b4a4995f        grafana/grafana:latest  
"sh -euc 'mkdir -p /…"   4 days ago          Up 56 seconds       0.0.0.0:3000->3000/tcp   surajmishra_grafana_1


使用 Spring Boot 配置 Loki
一旦我们启动了 Grafana 和 Loki 服务,我们需要配置我们的应用程序以向其发送日志。我们将使用loki-logback-appender,它将负责将日志发送到 Loki 聚合器来存储和索引日志。

首先,我们需要在pom.xml文件中添加loki-logback-appender:

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

其次,我们需要在src/main/resources文件夹下创建一个logging-spring.xml文件。该文件将控制 Spring Boot 应用程序的日志记录行为,例如日志格式、Loki 服务的端点等:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>        
   <appender name=
"LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http:
//localhost:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>app=${name},host=${HOSTNAME},level=%level</pattern>
                <readMarkers>true</readMarkers>
            </label>
            <message>
                <pattern>
                    {
                   
"level":"%level",
                   
"class":"%logger{36}",
                   
"thread":"%thread",
                   
"message": "%message",
                   
"requestId": "%X{X-Request-ID}"
                    }
                </pattern>
            </message>
         </format>
     </appender>
     
     <root level=
"INFO">
        <appender-ref ref=
"LOKI" />
     </root>
</configuration>

完成设置后,让我们编写一个简单的服务,在 INFO 级别记录数据:

@Service
class DemoService{
    private final Logger LOG = LoggerFactory.getLogger(DemoService.class);
    public void log(){
        LOG.info("DemoService.log invoked");
    }
}

日志聚合和可视化
由于使用loki-logback-appender进行配置设置,我们的服务日志被推送到 Loki 服务。我们可以通过在浏览器中访问http://localhost:3000(部署 Grafana 服务的位置)来可视化它。

要查看 Loki 中存储和索引的日志,我们需要使用 Grafana。 Grafana 数据源为 Loki 提供可配置的连接参数,我们需要在其中输入 Loki 端点、身份验证机制等。

结论
在本文中,我们使用 Grafana Loki 为 Spring Boot 应用程序设置日志记录。我们还通过单元测试和可视化验证了我们的设置,使用简单的逻辑记录INFO日志并在 Grafana 中设置 Loki 数据源。