Loki日志收集系统架构
通过Loki+Promtail+Grafana,搭建日志收集系统,可以用于收集Docker日志,nginx日志,kubernetes日志
- 通过Loki存储日志数据
- 通过promtail收集日志,上传到Loki数据源
- 通过Grafana连接Loki数据源,查询展示数据
官方文档地址
一.部署Loki
配置文件示例
auth_enabled: false
ingester:
chunk_idle_period: 30m # 如果块没有达到最大的块大小,那么在刷新之前,块应该在内存中不更新多长时间。过长有丢失日志风险,默认30m
chunk_block_size: 262144
chunk_retain_period: 1m # 块刷新后应该在内存中保留多长时间
max_transfer_retries: 0 # Number of times to try and transfer chunks when leaving before falling back to flushing to the store. Zero = no transfers are done.
lifecycler: #配置ingester的生命周期,以及在哪里注册以进行发现
ring:
kvstore:
store: inmemory # 用于ring的后端存储,支持consul、etcd、inmemory
replication_factor: 1 # 写入和读取的ingesters数量,至少为1(为了冗余和弹性,默认情况下为3)
wal:
dir: /data/loki/wal
limits_config:
retention_period: 72h # 过期时间
enforce_metric_name: false
reject_old_samples: true # 旧样品是否会被拒绝
reject_old_samples_max_age: 24h # 拒绝旧样本的最大时限
schema_config: # 配置从特定时间段开始应该使用哪些索引模式
configs:
- from: 2020-10-24 # 创建索引的日期。如果这是唯一的schema_config,则使用过去的日期,否则使用希望切换模式时的日期
store: boltdb-shipper # 索引使用哪个存储,如:cassandra, bigtable, dynamodb,或boltdb
object_store: filesystem # 用于块的存储,如:gcs, s3, inmemory, filesystem, cassandra,如果省略,默认值与store相同
schema: v11
index: # 配置如何更新和存储索引
prefix: index_ # 所有周期表的前缀
period: 24h # 表周期
server:
http_listen_port: 3100
http_server_read_timeout: 600s
http_server_write_timeout: 600s
query_scheduler:
# 最大未完成请求数
max_outstanding_requests_per_tenant: 2048
storage_config: # 为索引和块配置一个或多个存储
boltdb_shipper:
active_index_directory: /data/loki/boltdb-shipper-active
cache_location: /data/loki/boltdb-shipper-cache
cache_ttl: 24h
shared_store: filesystem
filesystem:
directory: /data/loki/chunks
chunk_store_config: # 配置如何缓存块,以及在将它们保存到存储之前等待多长时间
#max_look_back_period: 0s #限制查询数据的时间,默认是禁用的,这个值应该小于或等于table_manager.retention_period中的值
max_look_back_period: 72h
table_manager:
retention_deletes_enabled: true # 日志保留周期开关,用于表保留删除
retention_period: 72h # 日志保留周期,保留期必须是索引/块的倍数
compactor:
working_directory: /data/loki/boltdb-shipper-compactor
shared_store: filesystem
compaction_interval: 10m
retention_enabled: true
retention_delete_delay: 2h
retention_delete_worker_count: 150docker部署命令示例
docker run --user $(id -u) \
--name loki \
-itd \
--cpus 1 -m 1G \
--restart=unless-stopped \
--log-opt max-size=512m \
--log-opt max-file=3 \
-v /etc/hosts:/etc/hosts \
-v /etc/localtime:/etc/localtime \
-v $(pwd):/mnt/config \
-v $(pwd)/data:/data \
-p 3100:3100 \
grafana/loki:2.6.1 -config.file=/mnt/config/loki-config.yaml二.部署Promtail
配置文件
监控/var/log/{auth.log,syslog,kern.log}日志
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /mnt/config/positions.yaml
clients:
- url: http://local-loki:3100/loki/api/v1/push
external_labels:
hostname: ${HOSTNAME}
limits_config:
readline_rate_enabled: true
readline_rate: 4000
readline_burst: 5000
readline_rate_drop: false
target_config:
sync_period: "10s"
scrape_configs:
- job_name: audit_logs
pipeline_stages:
- match:
selector: '{job="audit_logs"}'
stages:
- regex:
source: filename
expression: '(?P<path>.*)/(?P<file_name>\\S+?)$'
- labels:
file_name:
static_configs:
- targets:
- localhost
labels:
job: audit_logs
host: ${HOSTNAME}
agent: promtail
__path__: /var/log/{auth.log,syslog,kern.log}收集/opt/xxx/xxx.log下的服务日志,添加到 scrape_configs: 下即可,记得docker部署启动的时候,将目录挂载到对应位置
- job_name: service_logs
static_configs:
- targets:
- localhost
labels:
job: service_logs
agent: promtail
__path__: /opt/*/logs/*.log
pipeline_stages:
# 这里通过正则,获取 /opt/xxx/info.log 中的xxx作为service标签的值,可以用于后续查询
- match:
selector: '{job="service_logs"}'
stages:
- regex:
source: filename
expression: '/opt/(?P<service>\\S+?)/'
- labels:
service:启动
需要添加host
local-loki 192.168.1.15docker部署命令示例
mkdir /opt/promtail
docker run --name promtail \
-h $(hostname) \
-itd \
--cpus 1 -m 2G \
--restart=unless-stopped \
--log-opt max-size=512m \
--log-opt max-file=3 \
-v /etc/hosts:/etc/hosts \
-v /etc/localtime:/etc/localtime \
-v /opt:/opt \
-v /var/log:/var/log \
-v /opt/promtail:/mnt/config \
grafana/promtail:2.6.1 -config.file=/mnt/config/promtail-config.yaml -config.expand-env=true三.部署Grafana
前期配置
# 创建数据存储目录
mkdir -p /opt/grafana/grafana
chmod 777 /opt/grafana/grafana
# 创建配置文件
docker run -itd --name "grafana" --entrypoint /bin/bash grafana/grafana:10.1.2
docker cp grafana:/etc/grafana/grafana.ini /opt/grafana/grafana.ini
docker rm -f grafana启动命令
docker run --name=grafana \
--hostname=$(hostname) \
--user=grafana \
--env=GF_SECURITY_ADMIN_USER=admin \
--env=GF_SECURITY_ADMIN_PASSWORD=admin \
--env=GF_PATHS_CONFIG=/etc/grafana/grafana.ini \
--env=GF_PATHS_DATA=/var/lib/grafana \
--env=GF_PATHS_HOME=/usr/share/grafana \
--env=GF_PATHS_LOGS=/var/log/grafana \
--env=GF_PATHS_PLUGINS=/var/lib/grafana/plugins \
--env=GF_PATHS_PROVISIONING=/etc/grafana/provisioning \
--volume=/etc/hosts:/etc/hosts \
--volume=/etc/localtime:/etc/localtime \
--volume=/opt/grafana/grafana.ini:/etc/grafana/grafana.ini \
--volume=/opt/grafana/grafana:/var/lib/grafana \
-p 3000:3000 \
--restart=unless-stopped \
--log-opt max-file=3 \
--log-opt max-size=512m \
--cpus 4 \
-itd \
grafana/grafana:10.1.2四.Grafana配置Loki数据源
1.登录grafana
2.点击左上角菜单栏 -> Connections -> Add new Connection
3.选择Loki数据源,添加新的数据源,输入loki地址信息保存
4.可以直接在Explore中查看查询日志
5.也可以自己自定义添加定制dashboard
模板可以通过 Dashboards 查找