一、简介
Grafana Loki是一组日志收集组件,由go语言开发。与ELK、EFK不同,loki的构建理念受到prometheus的启发,是对有关日志的元数据进行索引。日志数据本身会被压缩并以块的形式存储在本地或者对象存储中。小索引和高度的压缩的块,简化了操作和降低了loki的成本。
1、概述
loki是一个水平可扩展、高可用、多租户的日志聚合系统。
loki的组件构成:
agent:收集日志,可以使用自带的Promtail,也支持filebeat、fluentd、fluen-bit等多个日志收集组件。agent抓取日志,通过添加指标的形式,将日志转为流,并通过HTTP api推送给loki。
loki:主服务器,负责摄取和存储日志以及日志查询。它可以部署在三种不同的配置中。
Grafana:用于查询和显示日志数据。或者可以使用命令行进行查询。
2、架构
loki进程包含以下四种角色:
- querier:查询器
- inester:日志存储器
- query-frontend:前置查询器
- distributor:写入分发器
可以通过loki的二进制命令-target参数指定运行角色,默认为all
3、标签
类似于prometheus的标签,可以配置动态标签,类似于prometheus在k8s中的服务发现那样配置,但是官方建议不要使用太多的动态标签,尽量使用静态标签,因为loki可以根据日志中的关键字进行模糊匹配查询。
二、安装loki
1、通过yum进行安装loki
nano /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
#安装loki
yum install loki
#启动loki
systemd start loki && systemd enable loki
修改部分默认配置,以下是将数据保存在本地
cat /etc/loki/config.yml
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
grpc_server_max_recv_msg_size: 419430400
grpc_server_max_concurrent_streams: 1000
limits_config:
#每个用户每秒的摄取速率
ingestion_rate_mb: 10
#每个用户每秒的摄取突发流量大小
ingestion_burst_size_mb: 20
max_label_name_length: 2048
max_label_value_length: 4096
reject_old_samples: true
per_stream_rate_limit: 10MB
per_stream_rate_limit_burst: 30MB
max_chunks_per_query: 2000000
common:
instance_addr: 127.0.0.1
path_prefix: /opt/loki
storage:
filesystem:
chunks_directory: /opt/loki/chunks
rules_directory: /opt/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
还可以将日志存储到公有云购买的对象存储中。
例如存储到谷歌云的桶中,需要实例对桶有读取权限
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
grpc_server_max_recv_msg_size: 419430400
grpc_server_max_concurrent_streams: 1000
limits_config:
#每个用户每秒的摄取速率
ingestion_rate_mb: 20
#每个用户每秒的摄取突发流量大小
ingestion_burst_size_mb: 50
max_label_name_length: 2048
max_label_value_length: 4096
reject_old_samples: true
per_stream_rate_limit: 20MB
per_stream_rate_limit_burst: 50MB
max_chunks_per_query: 2000000
common:
instance_addr: 127.0.0.1
path_prefix: /opt/loki
storage:
filesystem:
chunks_directory: /opt/loki/chunks
rules_directory: /opt/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
storage_config:
boltdb_shipper:
active_index_directory: /opt/loki/boltdb-shipper-active
cache_location: /opt/loki/boltdb-shipper-cache
cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space
shared_store: gcs
gcs:
bucket_name: test-loki
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: gcs
schema: v11
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
2、客户端配置fluentd
因为已有的其他数据的日志收集是基于fluend,避免有多个日志收集工具,所以继续使用fluentd。
具体的安装步骤不再详细描述,
安装loki插件
fluent-gem install fluent-plugin-grafana-loki
fluentd配置如下
<source>
@type tail
tag loki-gamex-61
path /opt/supervisor/log/gamex/gamexlogiclog_*_%Y-%m-%d_%H.log
refresh_interval 10s
read_from_head true
pos_file /var/log/td-agent/gamexlogiclog.log.pos
path_timezone "+08"
<parse>
@type json
time_key time
time_format %N
</parse>
@log_level info
</source>
<match loki-gamex-61>
@type loki
url "http://10.0.0.2:3100"
extra_labels {"env":"mirror","gid":"61","app":"gamex"}
<buffer>
flush_interval 10s
chunk_limit_size 32m
chunk_limit_records 20000
flush_at_shutdown true
</buffer>
line_format json
buffer_type memory
buffer_chunk_limit 500m
@log_level info
</match>
三、查询日志
1、配置grafana数据源
2、查询实例
通过标签进行查询
通过标签加日志里的关键字进行查询,还支持正则表达式
具体表达时参考官方文档:https://grafana.com/docs/loki/latest/query/log_queries/