loki
Loki 是受 Prometheus 启发的程度可扩大,高度可用的多租户日志聚合零碎。它的设计具备很高的老本效益,并且易于操作。它不索引日志的内容,而是为每个日志流设置一组标签。
日志比照
ELK stack 和 Graylog,ELK 目前很多公司都在应用,是一种很不错的分布式日志解决方案,然而须要的组件多,部署和保护绝对简单,并且占用服务器资源多。底层存储是 es 导致占用服务器资源过多
Loki vs ELK
- Loki 和 ELK(Elasticsearch, Logstash, Kibana)都是罕用的日志解决零碎,它们各自具备一些长处。上面是 Loki 绝对于 ELK 的几个长处:
- 存储效率更高:Loki 应用了压缩和切割日志数据的办法来缩小存储空间的占用,相比之下,ELK 须要保护一个大的索引,须要更多的存储空间。
- 查问速度更快:Loki 应用相似 Prometheus 的标签索引机制存储和查问日志数据,这使得它可能疾速地进行分布式查问和聚合,而不须要将所有数据都从存储中加载到内存中。而 ELK 须要将数据从存储中加载到内存中进行查问,查问速度绝对较慢。
- 部署和治理更容易:Loki 是一个轻量级的日志聚合零碎,相比之下,ELK 须要部署和治理多个组件,须要更多的资源和人力老本。
劣势
与其余日志聚合零碎相比,Loki 有以下特点:
● 不对日志进行全文本索引。通过存储压缩的,非结构化的日志以及仅索引元数据,Loki 更加易于操作且运行老本更低。
● 应用与 Prometheus 雷同的标签对日志流进行索引和分组,从而使您可能应用与 Prometheus 雷同的标签在指标和日志之间无缝切换。
● 特地适宜存储 Kubernetes Pod 日志。诸如 Pod 标签之类的元数据会主动被抓取并建设索引。
● 在 Grafana 中具备本机反对(须要 Grafana v6.0)。
Loki 配置
auth_enabled: false
server:
http_listen_port: 3100 # 配置 HTTP 监听端口号为 3100。graceful_shutdown_timeout: 60s # 配置优雅停机的超时工夫为 60 秒。http_server_read_timeout: 60s # 配置 HTTP 服务器读取超时工夫为 60 秒。http_server_write_timeout: 60s # 配置 HTTP 服务器写入超时工夫为 60 秒。ingester: # 配置 Loki 的 ingester 局部,用于接管和解决日志数据。lifecycler: # 配置生命周期管理器,用于治理日志数据的生命周期。address: 127.0.0.1 # 配置生命周期管理器的地址
ring: # 配置哈希环,用于将日志数据调配给不同的 Loki 节点
kvstore: # 配置键值存储,用于存储哈希环的节点信息。反对 consul、etcd 或者 memroy, 三者选其一
store: inmemory # 配置存储引擎为 inmemory,即内存中存储
replication_factor: 1 # 配置复制因子为 1,即每个节点只存储一份数据。final_sleep: 0s # 配置最终休眠工夫为 0 秒,即敞开时立刻进行。chunk_idle_period: 1h # 配置日志块的闲暇工夫为 1 小时。如果一个日志块在这段时间内没有收到新的日志数据,则会被刷新。max_chunk_age: 1h # 配置日志块的最大年龄为 1 小时。当一个日志块达到这个年龄时,所有的日志数据都会被刷新。chunk_target_size: 1048576 # 配置日志块的指标大小为 2048576 字节(约为 1.5MB)。如果日志块的闲暇工夫或最大年龄先达到,Loki 会首先尝试将日志块刷新到指标大小。chunk_retain_period: 30s # 配置日志块的保留工夫为 30 秒。这个工夫必须大于索引读取缓存的 TTL(默认为 5 分钟)。max_transfer_retries: 0 # 配置日志块传输的最大重试次数为 0,即禁用日志块传输。wal:
enabled: true
dir: /loki/wal
schema_config: # 配置 Loki 的 schema 局部,用于治理索引和存储引擎。configs: # 配置索引和存储引擎的信息。- from: 2023-05-01 # 配置索引和存储引擎的起始工夫。store: boltdb-shipper # 配置存储引擎为 boltdb-shipper,即应用 BoltDB 存储引擎。object_store: filesystem # 配置对象存储引擎为 filesystem,即应用文件系统存储。schema: v11 # 配置 schema 版本号为 v11。index: # 配置索引相干的信息。prefix: index_ # 配置索引文件的前缀为 index_。period: 24h # 配置索引文件的周期为 24 小时。storage_config: # 配置 Loki 的存储引擎相干的信息。boltdb_shipper: # 配置 BoltDB 存储引擎的信息。active_index_directory: /loki/boltdb-shipper-active # 配置流动索引文件的存储目录为 /tmp/loki/boltdb-shipper-active。cache_location: /loki/boltdb-shipper-cache # 配置 BoltDB 缓存文件的存储目录为 /tmp/loki/boltdb-shipper-cache。cache_ttl: 240h # 配置 BoltDB 缓存的 TTL 为 240 小时。shared_store: filesystem # 配置共享存储引擎为 filesystem,即应用文件系统存储。filesystem: # 配置文件系统存储引擎的信息,即日志数据的存储目录为 /tmp/loki/chunks
directory: /loki/chunks
compactor: # 配置日志压缩器的信息。working_directory: /loki/boltdb-shipper-compactor # 配置工作目录为 /tmp/loki/boltdb-shipper-compactor。shared_store: filesystem #配置共享存储引擎为 filesystem,即应用文件系统存储
limits_config: # 配置 Loki 的限度策略。reject_old_samples: true # 配置是否回绝旧的日志数据。reject_old_samples_max_age: 168h # 配置回绝旧的日志数据的最大年龄为 168 小时。ingestion_rate_mb: 64 # 配置日志数据的最大摄入速率为 64MB/s。ingestion_burst_size_mb: 128 # 配置日志数据的最大摄入突发大小为 128MB。max_streams_matchers_per_query: 100000 # 配置每个查问的最大流匹配器数量为 100000。max_entries_limit_per_query: 50000 # 配置每个查问的最大条目限度为 50000。chunk_store_config: # 配置日志数据的存储策略。max_look_back_period: 0s # 配置最大回溯工夫为 240 小时。table_manager: # 配置 Loki 的表管理器。retention_deletes_enabled: false # 配置是否启用保留期删除。# retention_period: 240h # 配置保留期为 240 小时。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 配置
# 配置 promtail 程序运行时行为。如指定监听的 ip、port 等信息。server:
http_listen_port: 9080
grpc_listen_port: 0
# positions 文件用于记录 Promtail 发现的指标。该字段用于定义如何保留 postitions.yaml 文件
# Promtail 发现的指标就是指日志文件。positions:
filename: /etc/promtail/positions.yaml # 游标记录上一次同步地位
sync_period: 10s #10 秒钟同步一次
# 配置 Promtail 如何连贯到 Loki 的多个实例,并向每个实例发送日志。# Note:如果其中一台近程 Loki 服务器无奈响应或产生任何可重试的谬误,这将影响将日志发送到任何其余已配置的近程 Loki 服务器。# 发送是在单个线程上实现的!如果要发送到多个近程 Loki 实例,通常倡议并行运行多个 Promtail 客户端。clients:
- url: http://loki:3100/api/prom/push
# 配置 Promtail 如何发现日志文件,以及如何从这些日志文件抓取日志。scrape_configs: # 指定要抓取日志的指标。- job_name: http-log
pipeline_stages:
- regex:
expression: "^(?P<time>(\\d{4}-\\d{2}-\\d{2})\\s(\\d{2}:\\d{2}:\\d{2})) (?P<logtype>(\\[(.+?)\\])) (?P<appname>(\\[(.+?)\\])) (?P<requesttype>(\\[(.+?)\\])) (?P<tid>(\\[(.+?)\\])) (?P<cid>(\\[(.+?)\\])) (?P<traceid>(\\[(.+?)\\])) (?P<spanid>(\\[(.+?)\\])) (?P<parentid>(\\[(.+?)\\])) (?P<trace>(trace\\[(.+?)\\])) (?P<data>(.*)) (?P<logcate>(.*))"
- labels:
logtype:
logcate:
- timestamp:
source: time
format: RFC3339Nano
static_configs:
- targets:
- localhost # 指定抓取指标,i.e. 抓取哪台设施上的文件
labels: # 指定该日志流的标签
job: http-log
__path__: /var/logs/http/*.log # 指定抓取门路,该匹配标识抓取 /var/log/host 目录下的所有文件。留神:不蕴含子目录下的文件
regex 调试技巧
应用 regex 匹配时, 能够应用 https://regex101.com/ 进行调试
TIPS:
- Flavor 抉择 GOLANG
- Function 抉择 Match
- Match Information 能够查看你的匹配后果
Loki 选择器
点击“Log browser”,能够疾速浏览采集上来的 label 信息
查问表达式
对于查问表达式的标签局部,将其包装在花括号中 {}
应用键值对的语法来抉择标签
多个标签表达式用逗号分隔
全文匹配一个关键词 abc 的日志,能够这样写
{filename="/var/log/operation.LOG"} |="abc"
目前反对以下标签匹配运算符:
= 等于
!= 不等于
=~ 正则匹配
!~ 正则不匹配
以上操作根本满足了
部署
git clone https://github.com/hubyao/grafana_promtail_loki
cd grafana_promtail_loki
docker-compose up -d
参考资料
- Grafana Loki 初体验
- Promtail Pipeline 日志解决配置
- Grafana Loki 官网翻译 - 集体学习笔记
- Docker(14) docker-compose 装置 Grafana Loki 日志聚合零碎
- grafana Loki 轻量级日志收集零碎
- Loki+Grafana 查问语句
- Grafana Explore 中的日志