记录一下 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
    

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
    

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
  

启动命令:

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

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<timestamp>\S+?) (?P<level>\S+?) (?P<content>.*)$'
            - 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<timestamp>\S+?) (?P<level>\S+?) (?P<content>.*)$'
            - 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

上面的配置说明:

  • 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%n</Pattern>
             <charset>UTF-8</charset>
         </encoder>
    ... 省略
    

    生成出来的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
    ...
    

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

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

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

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

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

启动命令:

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

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
....

启动命令: 或者双击运行

 .\bin\grafana-server.exe

初始登录账户: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 中文翻译,不过建议和官方文档对照看
点击访问

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐