• Grafana+loki+promtail 收集logback微服务日志


    记录一下 PLG 收集运行日志的相关步骤和一些重点说明

    一、总体介绍

    在这里插入图片描述

    promtail : 读取、收集、传输日志信息

    loki: 存储 promtail 传输过来的日志信息,当然loki也可以存储其他 的收集工具收集的日志,例如:Fluent logstash等

    Grafana:日志展示层,读取loki接口日志信息展示在页面,提供动态查询

    二、场景说明

    1. 服务器环境采用 windows搭建,其他环境无非就是启动方式不一样
    2. 收集多个项目系统日志
    3. 日志是logback产生的
    4. 采用直接安装方式,直接读取具体路径的log文件

    三、下载安装

    3.1 官方文档

    https://grafana.com/docs/loki/latest/installation/

    3.2 下载路径

    3.2.1 loki

    1. 程序下载:
      https://github.com/grafana/loki/releases/
      选择下载文件是 logcli-windows-amd64.exe.zip

    2. 配置下载:

      wget  https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
      
      • 1

    3.2.2 promtail

    1. 程序下载:
      https://github.com/grafana/loki/releases/
      点击更多按钮 Show all 34 asserts
      在这里插入图片描述

    选择下载文件是 promtail-windows-amd64.exe.zip

    1. 配置下载:
      wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml
      
      • 1

    3.2.3 Grafana

    https://grafana.com/grafana/download?platform=windows

    3.3 配置启动

    3.3.1 loki

    设置一下配置文件 loki-local-config.yaml,loki用来存储日志,这里可以设置最大保存时间。
    参考: https://grafana.com/docs/loki/latest/configuration/examples/

    auth_enabled: false
    
    # 对外端口
    server:
      http_listen_port: 3100
    
    # 存储设置
    ingester:
      lifecycler:
        address: 127.0.0.1
        ring:
          kvstore:
            store: inmemory
          replication_factor: 1
        final_sleep: 0s
      chunk_idle_period: 5m
      chunk_retain_period: 30s
    
    schema_config:
      configs:
      - from: 2020-05-15
        store: boltdb
        object_store: filesystem
        schema: v11
        index:
          prefix: index_
          period: 168h
    
    # 数据存放地址 包含索引
    storage_config:
      boltdb:
        directory: /tmp/loki/index
    
      filesystem:
        directory: /tmp/loki/chunks
    
    limits_config:
      enforce_metric_name: false
      reject_old_samples: true
      reject_old_samples_max_age: 168h
    
    table_manager:
      retention_deletes_enabled: true
      # 注意和索引存储时间一致,按1周为单位  
      retention_period: 168h
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    启动命令:

     .\loki-windows-amd64.exe --config.file=loki-local-config.yaml
    
    • 1

    3.3.2 promtail

    这里是收集日志,涉及多个日志行合并为一条日志信息传输给 loki,以及设置按照 logback里面的时间序列作为 loki的时间序列等配置。

    这个不得说下,需要多看官方文档,里面配置比较细内容分散,需要结合其他人博客和官方文档进行分析测试。

    模拟两个 微服务Springboot的日志收集(wms_main 和 wms_tools),

    server:
      http_listen_port: 9080
      grpc_listen_port: 0
    
    positions:
      filename: /tmp/positions.yaml
    
    # 配置你的 loki 地址和端口
    clients:
      - url: http://localhost:3100/loki/api/v1/push
    
    scrape_configs:
      - job_name: wms_main
        static_configs:
          - targets:
              - localhost
            labels:
              job: wms_main
              app: wms
              name: jtwms
              __path__: E:\IDEA_HOME\guohe\wms-main-api\logs\*.log
        pipeline_stages:
          - match:
              selector: '{job="wms_main"}'
              stages:
                - regex:
                    expression: '^(?s)(?P\S+?) (?P\S+?) (?P.*)$'
                - multiline:
                    firstline: '^\d{4}-\d{2}-\d{2}T\d{1,2}:\d{2}:\d{2}\.\d{3}'
                    max_wait_time: 3s
                - labels:
                    level:
                    content:
                - timestamp:
                    format: RFC3339Nano
                    source: timestamp
      - job_name: wms_tools
        static_configs:
          - targets:
              - localhost
            labels:
              job: wms_tools
              __path__: E:\IDEA_HOME\guohe\wms-tools-api\logs\*.log
        pipeline_stages:
          - match:
              selector: '{job="wms_tools"}'
              stages:
                - regex:
                    expression: '^(?s)(?P\S+?) (?P\S+?) (?P.*)$'
                - multiline:
                    firstline: '^\d{4}-\d{2}-\d{2}T\d{1,2}:\d{2}:\d{2}\.\d{3}'
                    max_wait_time: 3s
                - labels:
                    level:
                - timestamp:
                    format: RFC3339Nano
                    source: timestamp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    上面的配置说明:

    • job_name 是 promtail收集任务或者是线程,一般一个job对应一个微服务日志收集工作

    • labels 配置项目中 __path__ 是微服务logback 日志的生产路径,建议docker方式的springboot 日志地址映射到主机路径即可。

    • labels 的其他配置是可以自定义的,比如你可以增加一个host 主机地址

    • pipeline_stages 是重点,里面配置主要用于修改调整收集到的日志,通过go的正则表达式进行解析 logback的一行日志信息,来配置生成最终要传递给loki的日志是什么样子的。

    • expression go语言正则表达式,对一行logback日志进行划分
      这里说下logback xml的配置规则如下:

       .... 省略
           <encoder>
               <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %-5level [%thread] %logger{36} L%line - %msg%nPattern>
               <charset>UTF-8charset>
           encoder>
      ... 省略
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      生成出来的logback日志信息如下:

      ...
      2022-09-12T18:53:22.085+08:00 INFO  [RMI TCP Connection(1)-192.168.50.1] o.s.web.servlet.DispatcherServlet L547 - Completed initialization in 19 ms
      2022-09-12T18:54:55.641+08:00 DEBUG [http-nio-9903-exec-2] c.m.s.shirojwt.filter.JwtFilter L130 - JwtFilter isAccessAllowed url:/api/tools/test
      2022-09-12T18:54:55.643+08:00 DEBUG [http-nio-9903-exec-2] c.s.w.m.f.s.ShiroJwtBussinessService L84 - 进入 认证 doGetAuthenticationInfo
      ...
      
      • 1
      • 2
      • 3
      • 4
      • 5

      可以看到表达式 前面两个是按照空格为分割符进行一行日志的拆解,主要目的是为了提取这一行日志的级别 level

    • multiline 配置项是为了传输到loki里面时,合并必要的日志行,例如java程序发生异常是的异常堆栈信息,这里就希望所有的堆栈信息合并一个日志条目存储到loki里面,在granfa页面上查看时比较方便

    • firstline 是合并日志行配置,表示什么样的开头表示是一条新日志,这里设置的是符合一行的日志信息以时间序列为开始的表示是一个新的日志条目。

    • timestamp 设置存储到loki里面的时间序列使用默认的还是从上面解析出来的值作为时间序列值, 为什么要这样做? 就是为了方便排序查看,不然默认的收集时间序列可能不会按照logbak的时间序列排序。

    • level 这里指 pipeline_stages 配置项下的,这里主要是将 logbak的日志等级加入到 标签中,为了方便查询。

    启动命令:

     .\promtail-windows-amd64.exe --config.file=promtail-local-config.yaml
    
    • 1

    3.3.3 Grafana

    可以修改配置文件 ./conf/defaults.ini 设置是否有访问前缀,或者是域名https方式访问这些。

    [server]
    protocol = http
    ...
    http_port = 3000
    ...
    domain = localhost
    
    # 这里添加了一个访问前缀 /grafana 目的是为了后面配置 nginx 代理方便区分。
    root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
    
    # 这里一定配置 true 表示 root_url  可以配置为子级路径访问
    serve_from_sub_path = true
    ....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    启动命令: 或者双击运行

     .\bin\grafana-server.exe
    
    • 1

    初始登录账户:admin/admin
    启动成功之后,http://localhost:3000/grafana/ 即可

    添加数据源:
    在这里插入图片描述
    选择 Loki类型的数据源
    在这里插入图片描述

    在这里插入图片描述
    然后 测试 和 发布这个配置:
    在这里插入图片描述
    设置查询条件:
    在这里插入图片描述
    查看日志信息: 观察看看 多行合并是否生效 , 时间序列是否生效。
    在这里插入图片描述
    例如上面的 打印 banner tools start ok ! 如果没有配置多行合并,则每一行都会被当成单独的日志条目进行存储展示。

    四、其他备注

    go语言正则表达式:
    http://c.biancheng.net/view/5124.html
    https://www.goregex.cn/

    promtail pipeline 中文翻译,不过建议和官方文档对照看
    点击访问

  • 相关阅读:
    机器学习02:模型评估
    【零代码工具】15 款企业级零代码开发平台推荐,总有一款是你心仪的
    【PHP】文件操作
    VBA学习(17):使用条件格式制作Excel聚光灯
    递归的总结和案例
    难以置信!四面斩获字节offer,全靠这份“算法最优解”宝典
    5V 全桥驱动芯片,大电流,具有 PWM(IN/IN)输入接口,可替代低压drv8837
    AWS入列CNCF基金会
    Leetcode 198. 打家劫舍 动态规划
    Go项目踩坑:go get下载超时,goFrame框架下的go项目里将vue项目的dist同步打包发布,go项目打包并压缩
  • 原文地址:https://blog.csdn.net/gzt19881123/article/details/126904724