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 页面

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

相关推荐
数据智能老司机4 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机5 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
宁zz5 小时前
乌班图安装jenkins
运维·jenkins
大丈夫立于天地间5 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
数据智能老司机5 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
IT成长日记5 小时前
【Kafka基础】Kafka工作原理解析
分布式·kafka
rainFFrain6 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
州周7 小时前
kafka副本同步时HW和LEO
分布式·kafka
@郭小茶8 小时前
docker-compose方式部署docker项目
运维·docker·容器
自由鬼8 小时前
开源虚拟化管理平台Proxmox VE部署超融合
linux·运维·服务器·开源·虚拟化·pve