一、简 介

Loki是受Prometheus启发由Grafana Labs团队开源的水平可扩展,高度可用的多租户日志聚合系统。 开发语言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据签,极大地降低了日志索引的存储。系统架构十分简单,由以下3个部分组成 :

Loki 是主服务器,负责存储日志和处理查询 。
promtail 是代理,负责收集日志并将其发送给 loki 。
Grafana 用于 UI 展示。
只要在应用程序服务器上安装promtail来收集日志然后发送给Loki存储,就可以在Grafana UI界面通过添加Loki为数据源进行日志查询(如果Loki服务器性能不够,可以部署多个Loki进行存储及查询)。作为一个日志系统不光只有查询分析日志的能力,还能对日志进行监控和报警。

image.png
Loki文档网址:https://grafana.com/docs/loki/latest/
下载网址:https://github.com/grafana/loki/releases

与 ELK 比 较优势

ELK虽然功能丰富,但规模复杂,资源占用高,操作苦难,很多功能往往用不上,有点杀鸡用牛刀的感觉。
loki 不对日志进行全文索引。通过存储压缩非结构化日志和索引元数据,Loki 操作起来会更简单,更省成本。
通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
安装部署简单快速,且受 Grafana 原生支持。

下载(这个版本可用)

  1. curl -O -L "https://github.com/grafana/loki/releases/download/v1.5.0/loki-linux-amd64.zip"
  2. curl -O -L "https://github.com/grafana/loki/releases/download/v1.5.0/promtail-linux-amd64.zip"
  3. wget https://dl.grafana.com/oss/release/grafana-7.1.0-1.x86_64.rpm

安装loki和grafana

loki和grafana部署在一个机器上,可以理解为server端 promtail作为采集工具,可以放在一起,也可以不在该服务器部署

loki

  1. mkdir /data
  2. mkdir /data/loki
  3. mkdir /data/loki/{chunks,index,wal}
  1. auth_enabled: false
  2. server:
  3. http_listen_port: 3100
  4. grpc_listen_port: 9096
  5. ingester:
  6. wal:
  7. enabled: true
  8. dir: /data/loki/wal
  9. lifecycler:
  10. address: 127.0.0.1
  11. ring:
  12. kvstore:
  13. store: inmemory
  14. replication_factor: 1
  15. final_sleep: 0s
  16. chunk_idle_period: 1h # Any chunk not receiving new logs in this time will be flushed
  17. max_chunk_age: 1h # All chunks will be flushed when they hit this age, default is 1h
  18. chunk_target_size: 1048576 # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first
  19. chunk_retain_period: 30s # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m)
  20. max_transfer_retries: 0 # Chunk transfers disabled
  21. schema_config:
  22. configs:
  23. - from: 2020-10-24
  24. store: boltdb-shipper
  25. object_store: filesystem
  26. schema: v11
  27. index:
  28. prefix: index_
  29. period: 24h
  30. storage_config:
  31. boltdb_shipper:
  32. active_index_directory: /data/loki/boltdb-shipper-active
  33. cache_location: /data/loki/boltdb-shipper-cache
  34. cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space
  35. shared_store: filesystem
  36. filesystem:
  37. directory: /data/loki/chunks
  38. compactor:
  39. working_directory: /data/loki/boltdb-shipper-compactor
  40. shared_store: filesystem
  41. limits_config:
  42. reject_old_samples: true
  43. reject_old_samples_max_age: 168h
  44. chunk_store_config:
  45. max_look_back_period: 0s
  46. table_manager:
  47. retention_deletes_enabled: false
  48. retention_period: 0s
  49. ruler:
  50. storage:
  51. type: local
  52. local:
  53. directory: /data/loki/rules
  54. rule_path: /data/loki/rules-temp
  55. alertmanager_url: http://localhost:9093
  56. ring:
  57. kvstore:
  58. store: inmemory
  59. enable_api: true

启动loki

  1. nohup ./loki-linux-amd64 -config.file=./config.yaml >./loki.log 2>&1 &

Grafana

本次部署使用Docker容器部署

  1. docker pull grafana/grafana
  2. docker run -d -p 3000:3000 --name grafana --restart=always grafana/grafana

promtail

  1. mkdir /opt/promtail
  2. unzip promtail-linux-amd64.zip
  3. vim promtail.yaml
  4. ------------------------
  5. server:
  6. http_listen_port: 9080
  7. grpc_listen_port: 0
  8. positions:
  9. filename: /var/log/positions.yaml # This location needs to be writeable by promtail.
  10. client:
  11. url: http://localhost:3100/loki/api/v1/push
  12. scrape_configs:
  13. - job_name: system
  14. pipeline_stages:
  15. static_configs:
  16. - targets:
  17. - 10.10.10.11
  18. labels:
  19. job: system_log
  20. host: 10.10.10.11
  21. __path__: /var/log/*log

启动

  1. nohup ./promtail-linux-amd64 -config.file=./promtail.yaml > ./promtail.log 2>&1 &

配置

grafana配置 默认账号admin 密码admin

image.png
image.png
image.pngimage.pngimage.pngimage.png

  1. # 查询标签
  2. curl -G -s "http://localhost:3100/loki/api/v1/labels" | jq
  3. curl -G -s "http://localhost:3100/loki/api/v1/labels" | jq .data[]
  1. # 根据标签查询对应标签值
  2. curl -G -s http://localhost:3100/loki/api/v1/label/<name>/values | jq
  3. curl -G -s "http://localhost:3100/loki/api/v1/label/app_kubernetes_io_instance/values" | jq .data[]