使用docker部署一套相比ELK更轻量的日志系统LPG

Why this

使用过ELK日志系统的话,你可能知道Logstash强大,它可以实现数据传输、格式处理、格式化输出,和强大的插件功能,经常用于日志处理,但是同时logstash也较为消耗资源,占用了很多的CPU和内存,并且由于没有消息队列缓存,存在数据丢失的隐患。很多时候我们对日志的需求并没有那么高,并不需要盯着日志分析结果,只是简单的看几个参数,有没有报错就停止了。更加常见的场景是,我们的服务器并没有那么多余的空间留给日志系统。

所以这篇文章来介绍一套轻量的日志系统LPG(loki、promtail、grafana)

  • loki: 主服务器,负责存储日志和处理查询
  • promtail: 代理,负责收集日志发送给loki
  • grafana: 看板,用来查询和显示日志

loki: like Prometheus, but for logs(像普罗米修斯监控一样,只不过是监控日志),受到普罗米修斯的启发的水平拓展、高可用、多租户日志聚合系统。

和其他聚合日志系统相比,loki:

  • 不对日志进行全文索引。通过存储压缩的非结构化日志和仅索引元数据,loki更易于操作且运行成本更低。
  • 使用您已经在 Prometheus 中使用的相同标签对日志流进行索引和分组,使您能够使用您已经在 Prometheus 中使用的相同标签在指标和日志之间无缝切换。
  • 尤其适合存储Kubernetes Pod 日志。Pod 标签等元数据会被自动抓取和索引。
  • 在 Grafana 看板中有图形界面支持(需要 Grafana v6.0)

根据官方介绍,可以了解到loki的优点是不会对日志全文索引,仅索引“标签”;压缩了非结构化的日志让体积更小;接下来介绍如何使用docker部署LPG日志系统

Get Started

loki.yml

这个文件是配置loki相关的,在docker-compose文件中会映射入loki的image内,我会把可能你会涉及到的配置标注上注释,更具体的配置请参考loki 官方文档

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 认证相关
auth_enabled: false

server:
# 监听的端口 因为promtail是主动推送日志给loki 所以需要监听端口号
http_listen_port: 3100

# 配置 ingester 以及 ingester 如何将自己注册到键值存储。
ingester:
lifecycler:
# ip地址
address: 127.0.0.1
ring:
kvstore:
# 存在内存中
store: inmemory
replication_factor: 1
final_sleep: 0s
# 指定时间内的块(chunk)未接收到新日志将会被清空
chunk_idle_period: 1h
# 所有的chunk都将在指定时间后被清空,默认1h
max_chunk_age: 1h
# 每个chunk大小为1.5M
chunk_target_size: 1048576
# 如果使用索引缓存,则这个时间必须大于索引读取缓存的TTL(默认索引读取缓存 TTL 为 5m)
chunk_retain_period: 30s
# 最大尝试次数 0为disabled
max_transfer_retries: 0

# 配置块索引模式及其存储位置
schema_config:
configs:
- from: 2019-11-17 # 创建索引存储区的第一天的日期。如果这是您唯一的 period_config,请使用过去的日期. 否则请使用您希望架构切换的日期。 YYYY-MM-DD 格式,例如:2018-04-15。
store: boltdb-shipper # 用于索引的储存
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h

# 配置索引和块的存储
storage_config:
boltdb_shipper:
active_index_directory: /loki/boltdb-shipper-active
cache_location: /loki/boltdb-shipper-cache
cache_ttl: 24h # 缓存保存时长,可以提升长查询的速度,但是会占据更多的空间
shared_store: filesystem
filesystem:
directory: /loki/chunks

compactor:
working_directory: /loki/boltdb-shipper-compactor
shared_store: filesystem

limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h

chunk_store_config:
max_look_back_period: 0s

table_manager:
retention_deletes_enabled: false
retention_period: 0s

ruler:
storage:
type: local
local:
directory: /loki/rules
rule_path: /loki/rules-temp
alertmanager_url: http://localhost:9093
ring:
kvstore:
store: inmemory
enable_api: true

promtail.yml

这个文件是配置promtail相关的,注释情况如上,更具体的配置请参考promtail 官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server:
http_listen_port: 9080 # 监听端口
grpc_listen_port: 0 # grpc 监听端口

positions:
filename: /tmp/positions.yaml

clients:
- url: http://loki:3100/loki/api/v1/push # loki的通讯地址 与 loki.yml内的监听端口对应

scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log # 在此处配置你要监听的日志的地址所存储的地址

docker-compose.yml

最后是lpg的compose文件, 具体每一行做了什么我会将注释写在文件里,如果你完全看不懂docker-compose,可以先尝试学习docker。

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
version: '3'

services:
# 日志的存储和解析
loki:
image: grafana/loki
container_name: lpg-promtail
volumes:
# 持久化loki配置 映射的地址可以根据自己的需求更改
- ../data/lpg/loki:/etcd/loki
# loki的配置文件
- ./loki.yml:/etc/loki-conf/loki.yml
command: -config.file=/etcd/loki-conf/loki.yml
ports:
- 3100:3100
networks:
- lpg

# 日志收集器
promtail:
image: grafana/promtail
container_name: lpg-promtail
volumes:
# 你需要将要监听的日志映射入容器内 使用编写软连接等方式将日志收集到一个文件夹内
# 通过promtail.yml对应的检索方式发现日志文件,修改左边的地址到你对应的日志存储地址
- ../data/lpg/logs:/var/log
# 持久化promtail
- ../data/lpg/promtail:/etc/promtail
# promtail的配置文件
- ./promtail.yml:/etc/promtail-conf/promtail.yml
command: -config.file=/etc/promtail-conf/promtail.yml
networks:
- lpg

# 日志看板 可视化
grafana:
image: grafana/grafana
container_name: lpg-grafana
ports:
- 3000:3000
networks:
- lpg

networks:
lpg:

文件结构

  • compose
    • data
      • lpg
        • logs 日志集合
        • loki loki持久化
        • promtail promtail持久化
    • lpg
      • loki.yml loki配置文件
      • docker-compose.yml compose文件
      • promtail.yml # promtail配置文件

这个结构只是一个参考,如果你会用docker,可以自己配置文件的位置和存储的地址等

启动compose文件

在编写完docker-compose文件之后,就可以启动了。需要注意的是,在启动promtail之前,promtail抓取日志的路径下应该至少存在一个符合抓取规则的日志,如果没有找到的话,promtail就会停止抓取。很多人一开始在grafana看板中找不到日志也是这个原因。

配置grafana

启动了compose文件之后,就可以进入grafana看板的地址查看效果了,启动的地址在3000(或者你自己设置的)端口,默认的账户名和密码都是admin。

在登录进入grafana之后,首先你应该配置数据来源(data source),如图1、2、3所示:

配置数据来源1
配置数据来源2
配置数据来源3

在配置完数据来源后,进入Explore查看当前的抓取情况,配置如图4、5、6所示:

配置查看页面4

根据图4的Add query会发现,一个grafana是可以对应多个loki的,对于有分布式部署日志收集需求的,就可以在这里设置多个数据来源来查看

配置查看页面5

点击展开图5的步骤2展开列表,选择你想通过哪种label来查看日志,我这里是通过文件名来筛选,然后在步骤4选择具体的文件。步骤5、6分别是查询的类型和最多限制多少行日志分页。 并且你还可以自己编写resulting selector(点击步骤8可以看到具体的语法详情)

配置查看页面6

在这里就基本大功告成了,你可以看到日志在时间内的产生速率,和各种过滤日志的方法,比如服务的日志存在大量重复的输出,就可以在Dedup(去重)处选择Signature,以特征过滤重复日志。根据图5中的步骤6来设置的每段多少行内容进行的分段等等。在这里还差一点,那就是我想看某一个时间段的日志,或者项目新版本刚上线,需要实时观看日志的产生可不可以呢?当然可以

live stream

在grafana看板右上角有按照你的需求查询和实时查询两个选项。可以通过这两个按钮查找所需时段的日志和实时产生的日志。在这里基本就是lpg的全部功能了。

end

到这里lpg部署的全部工作就完成了,如果你看到了这里,恭喜你学会了一套轻量、横向扩展的日志系统。如果在部署的过程中遇到了跟本文流程冲突的bug或者问题。可以在评论区留言或者通过邮箱联系我,我会尽量解答你的问题~

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2021 Jayj
  • 访问人数: | 浏览次数:

buy me a cup of coffee?

支付宝
微信