Loki 分布式日志中心服务
目录
Loki 是什么
Loki 配置文件介绍
Loki 安装
Promtail 配置文件介绍
Promtail 安装
Loki 整合 Grafana
Loki 是什么
Loki 是一个专为日志聚合和查询设计的开源分布式日志管理系统,由 Grafana Labs 开发。它与 Prometheus 类似,但用于处理日志,而不是指标数据。
Loki 特点
分布式架构:Loki 采用分布式设计,可以水平扩展,以处理大量的日志数据。它由多个组件构成,包括接收器、存储和查询服务,这些组件可以在不同的服务器上运行,以支持高吞吐量和高可用性。
标签系统:类似于 Prometheus,Loki 使用标签来组织和查询日志。标签是附加在日志流上的元数据,例如服务名、环境、主机等。这样可以很容易地通过标签来过滤和检索日志。
低成本存储:Loki 主要对日志的元数据进行索引(如时间戳和标签),而不是对日志内容进行全文索引。这种设计降低了存储和计算的成本,使 Loki 更加高效。
与 Prometheus 集成:Loki 可以与 Prometheus 结合使用,使用户可以通过 Grafana 进行统一的指标和日志视图。在 Grafana 中,你可以同时查看来自 Prometheus 的指标数据和来自 Loki 的日志数据。
易于部署和扩展: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 文件参数介绍
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 数据
# 创建目录
mkdir -p /opt/loki/data
# 授予读写权限
chmod 775 /opt/loki/data
创建 Loki 配置文件 loki-config.yaml,内容如下:
vim /opt/loki/data/loki-config.yaml
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 镜像
docker pull grafana/loki
如果docker一直拉不下来,请按这样操作:https://devpress.csdn.net/cloudnative/66d58f0f28d2c87ccbb2eaad.html
https://github.com/DaoCloud/public-image-mirror
启动 Loki 容器
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 容器启动日志
docker logs loki
开放防火墙端口 (和云服务安全组端口)
firewall-cmd --zone=public --add-port=3100/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
使用如下命令验证 Loki 是否启动成功
curl -G 'http://localhost:3100/loki/api/v1/query' --data-urlencode 'query={job="varlogs"}'
获取 Loki 容器ip地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' loki
Promtail 配置文件介绍
Promtail 是 Loki 的日志收集器,用于从文件、系统日志等来源收集日志并推送到 Loki。Promtail 的配置文件是 YAML 格式,定义了从哪些日志源收集日志、如何处理日志,以及将日志发送到 Loki 或其他输出目标的方式。
promtail.yaml 文件参数介绍
# 定义了 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 数据
mkdir -p /opt/promtail/data
# 授予读写权限
chmod 775 /opt/promtail/data
创建 Promtail 配置文件 promtail.yaml,内容如下:
vim /opt/promtail/data/promtail.yaml
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 镜像
docker pull grafana/promtail
如果docker一直拉不下来,请按这样操作:https://devpress.csdn.net/cloudnative/66d58f0f28d2c87ccbb2eaad.html
https://github.com/DaoCloud/public-image-mirror
启动 Promtail 容器
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 容器启动日志
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 页面
效果图,搜索指定日志内容