通过Loki+Promtail+Grafana,搭建日志收集系统,可以用于收集Docker日志,nginx日志,kubernetes日志

  1. 通过Loki存储日志数据
  2. 通过promtail收集日志,上传到Loki数据源
  3. 通过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: 150

docker部署命令示例

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.15

docker部署命令示例

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 查找

标签: Loki, Grafana, Promtail, 日志收集

添加新评论