Loki 分布式日志中心服务

目录

[Loki 是什么](#Loki 是什么)

[Loki 配置文件介绍](#Loki 配置文件介绍)

[Loki 安装](#Loki 安装)

[Promtail 配置文件介绍](#Promtail 配置文件介绍)

[Promtail 安装](#Promtail 安装)

[Loki 整合 Grafana](#Loki 整合 Grafana)


Loki 是什么

Loki 是一个专为日志聚合和查询设计的开源分布式日志管理系统,由 Grafana Labs 开发。它与 Prometheus 类似,但用于处理日志,而不是指标数据。

Loki 特点

  1. 分布式架构:Loki 采用分布式设计,可以水平扩展,以处理大量的日志数据。它由多个组件构成,包括接收器、存储和查询服务,这些组件可以在不同的服务器上运行,以支持高吞吐量和高可用性。

  2. 标签系统:类似于 Prometheus,Loki 使用标签来组织和查询日志。标签是附加在日志流上的元数据,例如服务名、环境、主机等。这样可以很容易地通过标签来过滤和检索日志。

  3. 低成本存储:Loki 主要对日志的元数据进行索引(如时间戳和标签),而不是对日志内容进行全文索引。这种设计降低了存储和计算的成本,使 Loki 更加高效。

  4. 与 Prometheus 集成:Loki 可以与 Prometheus 结合使用,使用户可以通过 Grafana 进行统一的指标和日志视图。在 Grafana 中,你可以同时查看来自 Prometheus 的指标数据和来自 Loki 的日志数据。

  5. 易于部署和扩展:Loki 可以与 Promtail、Fluentd 或 Fluent Bit 等日志收集器一起使用,简化了日志的收集和发送过程。Loki 的分布式设计还支持通过添加更多节点来扩展容量。

Loki 核心组件

  • Loki: 这是日志聚合系统的核心组件。Loki 负责存储、索引和检索日志数据。它采用类似于时间序列数据库的设计,但与传统日志系统不同,它主要将日志数据按时间和标签进行分组和索引,而不是对日志内容进行复杂的索引。

  • Promtail: 这是一个日志收集器,它将日志从文件、系统日志等来源收集并发送到 Loki。Promtail 负责对日志进行预处理和标记(附加标签),使日志可以在 Loki 中进行有效的索引和查询。

  • Fluentd/Logstash(可选): 虽然 Promtail 是 Loki 推荐的日志收集工具,但你也可以使用 Fluentd 或 Logstash 作为日志收集器,将日志数据发送到 Loki。

  • Grafana: 这是用于可视化日志数据的前端工具。Grafana 可以与 Loki 集成,允许你查询和展示存储在 Loki 中的日志数据,提供强大的数据可视化和分析功能。


Loki 配置文件介绍

loki-config.yaml 文件参数介绍

javascript 复制代码
auth_enabled: false  # 是否启用身份验证,默认不启用

# 配置 Loki 服务器的相关参数
server:
  http_listen_port: 3100					# Loki 监听的 HTTP 端口,默认是 3100。
  log_level: info							# Loki 日志的日志级别,如 info、debug、warn、error 等。
  grpc_server_max_recv_msg_size: 4194304    # GRPC服务器的最大接收消息大小

# 配置日志的 ingester 相关参数,控制日志数据的存储和处理。
ingester:
  chunk_target_size: 1048576				# 每个 chunk 的目标大小,单位是字节。
  chunk_idle_period: 5m						# 如果一个 chunk 在此时间段内没有新数据,它将被标记为闲置,loki将关闭此块。
  chunk_retain_period: 30s					# 关闭块后 30 秒内持久化到磁盘。
  max_chunk_age: 1h							# 每个 chunk 的最大年龄,超过这个时间的 chunk 会被处理。
  lifecycler:								# 控制 ingester 生命周期的组件。
    ring:									# 用于管理 ingester 集群的状态。
      kvstore:								# 配置 key-value 存储
        store: inmemory						# 设置为 inmemory,表示使用内存作为 kvstore,适用于开发和测试环境。
      replication_factor: 1					# 日志数据的复制因子,设置为 1 表示不进行数据复制。
	  
# 配置 Loki 存储后端的相关设置。
storage_config:
  boltdb_shipper:							# BoltDB Shipper 是一个索引存储类型,配置包括索引目录、缓存位置和共享存储类型。
    active_index_directory: /loki/index		# 索引文件存储目录
    cache_location: /loki/cache				# 缓存文件位置
    shared_store: filesystem				# 共享存储类型
  filesystem:								# 文件系统存储配置
    directory: /loki/chunks					# 指定日志数据存储目录
	
# 配置 Loki 使用的存储模式和索引策略。
schema_config:
  configs:
  - from: 2020-10-24						# 配置生效开始日期。该日期之后接收到的所有日志都会使用这个配置。
    store: boltdb							# 存储类型,boltdb 表示 BoltDB。boltdb-shipper,表示使用 BoltDB Shipper 存储索引
    object_store: filesystem				# 对象存储类型,filesystem 表示使用文件系统存储。
    schema: v11								# 使用的模式版本。
    index:									# 索引的前缀和周期。
      prefix: index_						# 索引的前缀,设置为 index_。
      period: 24h							# 索引周期,设置为 24 小时。表示每 24 小时生成一个新的索引。

# 配置日志压缩器的相关设置。
compactor:
  working_directory: /loki/compactor		# 压缩器的工作目录。
  shared_store: filesystem					# 共享存储类型,通常是 filesystem。
  
# 配置 Loki 的资源限制设置。
limits_config:
  ingestion_rate_mb: 100					# 每秒的最大 ingestion 速率,单位是 MB。
  ingestion_burst_size_mb: 200				# 允许的最大突发 ingestion 大小,单位是 MB。
  max_streams_per_user: 10000				# 每个用户允许的最大流数量。
  enforce_metric_name: false				# 是否强制执行指标名称规则,设置为 false,即不强制。
  reject_old_samples: true					# 是否拒绝旧的样本,设置为 true。
  reject_old_samples_max_age: 168h			# 最大允许的样本年龄,设置为 168 小时(7 天)。超过这个时间的样本会被拒绝。
  
# 配置 chunk 存储。
chunk_store_config:
  max_look_back_period: 0s					# 最大回溯时间,设置为 0s 表示没有回溯时间限制。此设置影响在查询时 Loki 可以回溯的时间段。
  
# 管理表格和数据保留策略。
table_manager:
  retention_deletes_enabled: false			# 是否启用数据保留删除功能,设置为 false,表示不启用。
  retention_period: 0s						# 设置为 0s 表示禁用数据保留策略,即不会自动删除数据。所有数据将一直保留,直到手动删除或其他外部原因导致数据丢失。如果你希望设置一个实际的保留时间(例如 7 天),可以将其设置为 7d。这样,Loki 会保留过去 7 天的数据,超过这个时间的数据将会被自动删除。
  
# 配置 Loki 的前端服务。
frontend:
  max_chunk_age: 1h							# 前端服务中 chunk 的最大年龄。

Loki 安装

创建一个目录用于存储 Loki 数据

javascript 复制代码
# 创建目录
mkdir -p /opt/loki/data

# 授予读写权限
chmod 775 /opt/loki/data

创建 Loki 配置文件 loki-config.yaml,内容如下:

javascript 复制代码
vim /opt/loki/data/loki-config.yaml
javascript 复制代码
auth_enabled: false					# 禁用身份验证,适用于本地或测试环境。

server:
  http_listen_port: 3100			# Loki 将在本地的 3100 端口上提供 HTTP 服务。

ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory				# 使用内存来管理 ingester 的哈希环。在生产环境中,推荐使用 etcd 或 consul。
      replication_factor: 1			# 定义每条日志数据的副本数量。在这里,副本因子为 1,表示数据只存储在一个节点上。生产环境中通常设置为 2 或 3,以提高数据可靠性。
  chunk_idle_period: 15m			# 如果日志 15 分钟没有更新,将关闭该日志的块。
  chunk_retain_period: 30s			# 关闭块后 30 秒内持久化到磁盘。
  max_transfer_retries: 0

schema_config:
  configs:
    - from: 2020-10-24				# 从指定日期开始使用此配置。
      store: boltdb-shipper			# 使用 boltdb-shipper 作为索引存储。
      object_store: filesystem		# 日志块和索引都存储在文件系统中。
      schema: v11
      index:
        prefix: index_				# 索引前缀
        period: 24h					# 每 24 小时为一周期创建一个新的索引。

storage_config:
  boltdb_shipper:
    active_index_directory: /opt/loki/data/index		# 活跃索引的存储路径
    cache_location: /opt/loki/data/cache				# 用于存储索引缓存的目录。
    shared_store: filesystem
  filesystem:
    directory: /opt/loki/data/chunks					# 日志块存储在 /tmp/loki/chunks。

limits_config:
  enforce_metric_name: false					# 不强制要求日志必须有 __name__ 标签。
  reject_old_samples: true						# 是否拒绝旧的样本,设置为 true。
  reject_old_samples_max_age: 168h				# Loki 将拒绝超过 7 天的旧日志数据。

chunk_store_config:
  max_look_back_period: 0s						# 没有日志回溯时间的限制。

compactor:
  working_directory: /opt/loki/data/compactor    # 压缩工作目录
  retention_enabled: true

table_manager:
  retention_deletes_enabled: true                # 是否自动删除
  retention_period: 30d                          # 自动删除30天之前的数据

拉取 Loki 的官方 Docker 镜像

javascript 复制代码
docker pull grafana/loki

如果docker一直拉不下来,请按这样操作:https://devpress.csdn.net/cloudnative/66d58f0f28d2c87ccbb2eaad.html

https://github.com/DaoCloud/public-image-mirror

启动 Loki 容器

javascript 复制代码
docker run -d \
  --name loki \
  -p 3100:3100 \
  --user root \
  -v /opt/loki/data/loki-config.yaml:/etc/loki/local-config.yaml \
  -v /opt/loki/data:/opt/loki/data \
  grafana/loki \
  -config.file=/etc/loki/local-config.yaml

查看 Loki 容器启动日志

javascript 复制代码
docker logs loki

开放防火墙端口 (和云服务安全组端口)

javascript 复制代码
firewall-cmd --zone=public --add-port=3100/tcp --permanent   
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

使用如下命令验证 Loki 是否启动成功

javascript 复制代码
curl -G 'http://localhost:3100/loki/api/v1/query' --data-urlencode 'query={job="varlogs"}'

获取 Loki 容器ip地址

javascript 复制代码
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' loki

Promtail 配置文件介绍

Promtail 是 Loki 的日志收集器,用于从文件、系统日志等来源收集日志并推送到 Loki。Promtail 的配置文件是 YAML 格式,定义了从哪些日志源收集日志、如何处理日志,以及将日志发送到 Loki 或其他输出目标的方式。

promtail.yaml 文件参数介绍

javascript 复制代码
# 定义了 Promtail 的 HTTP 和 gRPC 监听端口,用于获取健康状态和指标信息。
server:
  http_listen_port: 9080							# Promtail 提供 HTTP 端口(默认 9080),用于健康检查和 Prometheus metrics。
  grpc_listen_port: 0								# gRPC 服务端口,默认不启用(设置为 0 关闭)。


# 记录 Promtail 已经读取的日志文件位置,用于重启后继续读取未读取的日志。
positions:
  filename: /var/log/promtail/positions.yaml		# 位置文件的路径,Promtail 会在这里存储读取日志文件的偏移量,确保不会重复读取已处理过的日志。

# 定义了 Promtail 如何将日志推送到 Loki(或其他兼容的后端)。
clients:
  - url: http://loki:3100/loki/api/v1/push			# Loki 服务的 URL,Promtail 将日志推送到此地址。通常为 Loki 的 /loki/api/v1/push 端点。

# 是 Promtail 配置中最核心的部分,定义了日志源及其相应的标签和处理方式。它的结构类似于 Prometheus 的 scrape_configs
scrape_configs:
  - job_name: system						# 日志抓取任务的名称,自定义随便写
    static_configs:							# 静态配置日志来源。
      - targets:							# 目标地址,通常设置为 localhost,因为 Promtail 在本地收集日志。
          - localhost
        labels:								# 分配给日志流的标签,可以为日志流添加自定义标签,常见的标签有 job 和 __path__
          job: varlogs
          __path__: /var/log/*.log			# 采集日志文件的路径,支持通配符。Promtail 会根据这个路径匹配文件。

  - job_name: custom_logs
    static_configs:
      - targets:
          - localhost
        labels:
          job: custom
          __path__: /opt/logs/*.log

    pipeline_stages:						# 用于在日志推送到 Loki 之前对日志进行预处理。常见的处理步骤包括日志格式解析、标签提取、过滤和时间戳转换等。
      - match:								# 用于选择日志流,可以根据标签选择要处理的日志。
          selector: '{job="custom"}'		# 日志选择器,用于匹配特定标签的日志流。
          stages:							# 日志处理的阶段。
            - json:							# 将日志解析为 JSON,并提取指定字段作为标签。
                expressions:				# 定义从 JSON 日志中提取哪些字段。
                  level: level
                  msg: message
            - labels:						# 指定哪些字段会成为 Loki 中的标签。
                level:
            - timestamp:
                source: time
                format: RFC3339				# 定义日志中的时间戳字段,并指定其格式。这里使用了 RFC3339 格式。

# 控制 Promtail 的资源使用,以避免过高的资源消耗。
limits_config:
  max_entry_size: 512000       # 单个日志条目的最大大小,单位为字节(默认为 500 KB)。如果日志条目超过这个大小,Promtail 会丢弃这个条目。

# 配置 Promtail 的 Prometheus 指标导出,以便 Prometheus 监控 Promtail 的状态和性能。
metrics:
  port: 3101                  # Prometheus 指标端口
  path: /metrics              # Prometheus 指标路径

# 配置日志目标的同步周期。
target_config:
  sync_period: 10s            # 指定日志源同步的时间间隔。Promtail 会根据这个周期检查和更新日志文件的状态。默认值是 10 秒。

# (全局配置)定义了在日志推送到 Loki 之前的处理管道。每个阶段处理日志的不同方面。
pipeline_stages:
  - docker: {}                 # 示例:Docker 日志处理阶段
  - json:                      # 示例:JSON 解析处理阶段
      expressions:			   # 定义要从 JSON 日志中提取的字段。例如,level 和 msg。
        level: level
        msg: message
  - labels:                    # 从日志中提取字段作为标签。这可以用于根据日志内容动态地创建标签。
      level
  - timestamp:                 # 示例:处理日志的时间戳阶段。
      source: time			   # 指定时间戳字段来源,例如 time。
      format: RFC3339		   # 时间戳格式,支持的格式包括 RFC3339 和其他标准日期格式。

# 用于覆盖默认配置,为特定日志源配置不同的处理方式。
overrides:
  - source: /var/log/*.log     # 指定要覆盖默认配置的日志源路径。
    path: /fluentd/log/*.log   # 在 Promtail 中指定日志文件路径(例如,容器内部路径)。
    labels:					   # 为日志流指定额外的标签,覆盖默认标签设置。
      job: override

# 用于配置与其他系统或插件的集成。
integrations:
  - name: integration_name     # 集成的名称,例如第三方插件或系统的名称。
    config:
      key: value               # 集成的配置项,取决于具体集成的要求。


# 用于为日志流添加外部标签。
external_labels:
  cluster: my-cluster  # 外部标签,用于标识日志来源的集群或其他标识符。这些标签将被附加到所有日志流中。

# 配置日志块的大小
chunk_target:
  size: 100m           # 设置日志块的最大大小。用于控制 Promtail 将日志分成多大的块进行处理。默认为 100 MB。

# 配置日志采样器,用于从日志流中采样数据。
samplers:
  - name: sampler_name			# 采样器的名称,用于定义不同的采样策略。
    config:						# 采样器的配置项,具体配置取决于所使用的采样器类型。
      key: value

Promtail 安装

需要抓取哪台服务器的日志?就把 promtail 在那台服务器上安装并运行。

创建一个目录用于存储 promtail 数据

javascript 复制代码
mkdir -p /opt/promtail/data

# 授予读写权限
chmod 775 /opt/promtail/data

创建 Promtail 配置文件 promtail.yaml,内容如下:

javascript 复制代码
vim /opt/promtail/data/promtail.yaml
javascript 复制代码
server:
  http_listen_port: 9080

positions:                                          # 记录 Promtail 已经读取的日志文件位置,用于重启后继续读取未读取的日志。确保不会重复读取已处理过的日志。
  filename: /opt/promtail/data/promtail-positions.yaml        # 这个路径在容器内,需要挂载到物理机上

clients:
  - url: http://172.17.0.3:3100/api/prom/push     # Loki 服务的 URL,Promtail 将日志推送到此地址。通常为 Loki 的 /loki/api/v1/push 端点。如果 loki和promtail使用同一台机器的docker部署的,这里的http://loki 地址是loki容器ip地址,也可以写物理机IP地址

scrape_configs:
  - job_name: spring_logs                   # 日志抓取任务的名称,例如抓取springboot的,就叫spring_logs
    static_configs:
      - targets:                            # 由于 Promtail 是用于收集本地日志的,因此 targets 一般配置为 localhost,或使用虚拟主机名,这样 Promtail 可以从容器内的文件系统中抓取日志。
          - localhost                       # localhost 表示抓取容器内的日志
        labels:
          job: varlogs                      # 自定义标签名称,例如,你可以通过查询 job="varlogs" 来筛选出所有带有 job=varlogs 标签的日志
		  server: 192.168.10.10				# 自定义标签名称,例如,你可以通过查询 server="192.168.10.10" 来筛选出所有带有 server=192.168.10.10 标签的日志,表示这里的日志都来自 192.168.10.10 的机器
          __path__: /var/log/*.log          # 抓取容器内哪个目录下的日志?这里需要把物理机要抓取日志的目录挂载到这里配置的这个目录

拉取 Promtail 的官方 Docker 镜像

javascript 复制代码
docker pull grafana/promtail

如果docker一直拉不下来,请按这样操作:https://devpress.csdn.net/cloudnative/66d58f0f28d2c87ccbb2eaad.html

https://github.com/DaoCloud/public-image-mirror

启动 Promtail 容器

javascript 复制代码
docker run -d \
  --name=promtail \
  -v /opt/promtail/data/promtail.yaml:/etc/promtail/promtail.yaml \
  -v /opt/promtail/data:/opt/promtail/data \
  -v /app/logs:/var/log \
  grafana/promtail \
  -config.file=/etc/promtail/promtail.yaml

查看 Promtail 容器启动日志

javascript 复制代码
docker logs promtail

验证 Promtail 采集日志推向 Loki

docker 启动的时候,挂载的物理机日志目录是 /app/logs,我们在 /app/logs 目录下放一些以 .log为后缀的日志文件。然后查看 promtail 容器日志输出内容

/app/logs/app.log 文件

Promtail 容器日志输出

成功 !


Loki 整合 Grafana

Grafana 相关配置,请查看:https://blog.csdn.net/a1053765496/category_12770223.html

Grafana 配置 Loki 数据源

打开 Grafana Web 页面

进入 Connections -> Data sources -> Add data source

Grafana 配置 Loki 面板

搜索指定的日志内容


Grafana 面板应用市场官网:https://grafana.com/grafana/dashboards

可以在应用市场搜索 Loki 相关面板

复制 id

复制 id 后 回到我们的 Grafana 页面

效果图,搜索指定日志内容

相关推荐
摸鱼也很难17 分钟前
Docker 镜像加速和配置的分享 && 云服务器搭建beef-xss
运维·docker·容器
woshilys1 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
疯狂飙车的蜗牛1 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
恩爸编程2 小时前
探索 Nginx:Web 世界的幕后英雄
运维·nginx·nginx反向代理·nginx是什么·nginx静态资源服务器·nginx服务器·nginx解决哪些问题
Michaelwubo3 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
Data跳动4 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
好像是个likun4 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
Java程序之猿5 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
来一杯龙舌兰6 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
cominglately6 小时前
centos单机部署seata
linux·运维·centos