loki收集docker容器里运行服务的日志,loki+grafana

Loki 学习总结(1)—— Loki 中小项目日志系统的不二之选_科技D人生的博客-CSDN博客_loki日志系统

Sentry、Loki 轻量级日志系统部署及应用-pudn.com

上面两个链接版本比较新, 用新的docker plugin插件和配置

Java spring在docker运行,做了logbck后发现日志不输出到容器里目录(挂载目录)而是通过docker log 查看或者还要在pom.xml下加docker插件依赖,很是麻烦

 最后面附上 loki-local-config.yaml和promtail-docker-config.yaml配置文件

普通收集loki+grafana+promtail

loki进行日志聚合处理  类似elk中的es

promtail是日志收集,类似elk中的logstash filebeat等,如果是只收集docker容器的日志则可以用loki的docker plugin替代

grafana是日志显示,类似elk中的kibana,可以通过各种标签和表达式过滤显示日志

version: "3"
services:
  loki:
    image: grafana/loki
    container_name: loki
    restart: always
    ports:
      - "3100:3100"
    volumes:
      - $PWD:/etc/loki
    command: -config.file=/etc/loki/loki-local-config.yaml
  promtail:
    image: grafana/promtail
    container_name: promtail
    restart: always
    volumes:
      - $PWD:/etc/promtail  #当前目录下挂载对应
      - /app/promtail:/opt  #挂载日志到容器1  ,1和2按其配置选择
      - /app/promtail/log:/var/log  #挂载挂载日志到容器2
    command: 
      -config.file=/etc/promtail/promtail-docker-config.yaml
  
  grafana:
    image: grafana/grafana:master
    restart: always
    environment:
    - TZ=Asia/Shanghai
    - LANG=zh_CN.UTF-8
    ports:
    - 3000:3000
docker-compose -f loki.yml up -d

安装loki的docker plugin

旧版本 

docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

 新版本插件(loki2.2.1可以,2.2.1+没测 )

默认安装
docker plugin install grafana/loki-docker-driver:main --alias loki --grant-all-permissions

#指定仓库地址下载安装
docker plugin install registry.docker.com/grafana/loki-docker-driver:main --alias loki --grant-all-permissions

docker版本13安装失败了,18 19正常

两种方式 全局和指定容器

  • 配置daemon.json,收集此后创建的所有容器的日志(注意,是配置daemon.json后重启docker服务后创建的容器才会把日志输出到loki)。
  • 新建容器时指定logging类型为loki,这样只有指定了logging的容器才会输出到loki

全局收集配置

编辑daemon.json。linux下默认路径是/etc/docker/daemon.json (需要sudo), windows则默认是%userprofile%\.docker\daemon.json

{
  "log-driver": "loki",
  "log-opts": {
    "loki-url": "http://YOUR_IP:3100/loki/api/v1/push",
    "max-size": "50m",
    "max-file": "10"
  },
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

记得把YOUR_IP换成loki所在主机的IP,一般都是本机的局域网地址,如果loki映射的端口换了记得这里也需要换。镜像仓库地址也可以换成自己云服务的。

其中max-size表示日志文件最大大小,max-file表示最多10个日志文件,都是对单个容器来说的。

然后重启docker服务。

sudo systemctl restart docker

在此之后创建的容器默认都会把日志发送到loki。

如果不全局配置,而只想特定的容器进行日志收集,则根据启动容器的方式,有两种配置方法。

docker run配置日志输出到loki

通过docker run启动容器,可以通过--log-driver来指定为loki。示例如下

docker run --rm --name=grafana --log-driver=loki --log-opt loki-url="http://YOUR_IP:3100/loki/api/v1/push" --log-opt max-size=50m --log-opt max-file=10 grafana/grafana
--log-driver=loki指定日志驱动器为loki
--log-opt loki-url则指定了loki的url
--log-opt max-size日志最大大小
--log-opt max-file日志文件最大数量

docker-compose 配置日志输出到loki

docker-compose 小于3.4可以对需要日志输出的配置添加配置如下 

每个容器服务加一个,例如

version: "3"
services:
  promtail:
    image: grafana/promtail
    container_name: promtail
    restart: always
    volumes:
      - $PWD:/etc/promtail
      - /app/promtail:/opt
      - /app/promtail/log:/var/log
    command: 
      -config.file=/etc/promtail/promtail-docker-config.yaml
    logging:
      driver: loki
      options:
        loki-url: "http://123.123.123.123:3100/loki/api/v1/push"
        max-size: "50m"
        max-file: "10"

注意:max-size和max-file这里需要加引号

对于3.4极其以上版本可以通过定义模板来减少代码量

version: "3.4"

x-logging:
  &loki-logging
  driver: loki
  options:
    loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
    max-size: "50m"
    max-file: "10"

services:
  host:
    container_name: grafana
    image: grafana/grafana
    environment:
    - TZ=Asia/Shanghai
    - LANG=zh_CN.UTF-8
    logging: *loki-logging

&loki-logging表示定义模板

*loki-logging表示引用模板。对于多个服务就只需要对应加上一行 logging: *loki-logging 即可。相比之前的版本可谓是大大简化了

下面grafana 配置loki 自带查询示例 ,loki文档LogQL - 《Loki Document》 - 书栈网 · BookStack

网友翻译的中文查询

https://blog.csdn.net/weixin_44267608/article/details/105264432 

最后一图

同名服务或者容器的会全显示日志,例如名字:a  会显示所有a服务或容器的日志 不分主机

主机的会显示这个主机所有发过来的日志,例如主机b  会显示b主机下所有传过来的服务或者容器

附上loki-local-config.yaml

这个好像不是最新版 ,可以看官方配置 

auth_enabled: false

server:
  http_listen_port: 3100  #端口

ingester:
  lifecycler:
    address: 127.0.0.1 #ip
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s

schema_config:
  configs:
  - from: 2018-04-15
    store: boltdb
    object_store: filesystem
    schema: v9
    index:
      prefix: index_
      period: 168h  #保存时间 删除索引

storage_config:
  boltdb:
    directory: /tmp/loki/index

  filesystem:
    directory: /tmp/loki/chunks

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h

chunk_store_config:
  max_look_back_period: 0

table_manager:
  chunk_tables_provisioning:
    inactive_read_throughput: 0
    inactive_write_throughput: 0
    provisioned_read_throughput: 0
    provisioned_write_throughput: 0
  index_tables_provisioning:
    inactive_read_throughput: 0
    inactive_write_throughput: 0
    provisioned_read_throughput: 0
    provisioned_write_throughput: 0
  retention_deletes_enabled: true    #删除日志 下面是保存时间
  retention_period: 168h

loki2.2.1的 loki.yml配置文件(和loki-local-config.yaml这个一样改个文件名就行

2.2.1+以上的没试过这配置文件

auth_enabled: false

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 1h       # Any chunk not receiving new logs in this time will be flushed
  max_chunk_age: 1h           # All chunks will be flushed when they hit this age, default is 1h
  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
  chunk_retain_period: 30s    # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m)
  max_transfer_retries: 0     # Chunk transfers disabled

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /loki/boltdb-shipper-active
    cache_location: /loki/boltdb-shipper-cache
    cache_ttl: 24h         # Can be increased for faster performance over longer query periods, uses more disk space
    shared_store: filesystem
  filesystem:
    directory: /loki/chunks

compactor:
  working_directory: /loki/boltdb-shipper-compactor
  shared_store: filesystem

limits_config:
  reject_old_samples: true
  reject_old_samples_max_age: 168h

chunk_store_config:
  max_look_back_period: 0s

table_manager:
  retention_deletes_enabled: false
  retention_period: 0s

ruler:
  storage:
    type: local
    local:
      directory: /loki/rules
  rule_path: /loki/rules-temp
  alertmanager_url: http://localhost:9093
  ring:
    kvstore:
      store: inmemory
  enable_api: true

2.6.1以上的loki.yml配置文件。参考旧配置文件和官方下的配置结合 终于启动成功

loki/cmd/loki at main · grafana/loki · GitHub官方配置参考 

auth_enabled: false

server:
  http_listen_port: 3100

common:
  path_prefix: /loki
  storage:
    filesystem:
      chunks_directory: /loki/chunks
      rules_directory: /loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h


storage_config:
  boltdb_shipper:
    active_index_directory: /loki/boltdb-shipper-active
    cache_location: /loki/boltdb-shipper-cache
    cache_ttl: 24h         # Can be increased for faster performance over longer query periods, uses more disk space
    shared_store: filesystem
  filesystem:
    directory: /loki/chunks

compactor:
  working_directory: /loki/boltdb-shipper-compactor
  shared_store: filesystem

limits_config:
  reject_old_samples: true
  reject_old_samples_max_age: 168h


ruler:
  alertmanager_url: http://localhost:9093

promtail-docker-config.yaml

server: 
  http_listen_port: 0
  grpc_listen_port: 0

positions:
  filename: /etc/promtail/positions.yaml   # 游标记录上一次同步位置
  sync_period: 10s #10秒钟同步一次

clients:
  - url: http://x.x.x.x:3100/loki/api/v1/push

scrape_configs:
- job_name: test-java-log
  static_configs:
  - targets:
      - localhost
    labels:
      job: test
      #name: tt    #多可以命名几个
      __path__: /opt/*.log   # docker运行时已经把宿主机的目录 /opt/ 映射给了promtail 容器的 /opt/,所以这个地方可以直接访问log文件

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker Loki Grafana是一种开源的日志聚合与可视化解决方案。它结合了Docker容器化技术、Loki日志收集工具和Grafana数据可视化平台,为用户提供了一种简单且高效的方法来收集、存储、查询和可视化日志数据。 首先,Docker是一种容器化技术,它可以将应用程序及其依赖项打包成一个独立的可执行容器,使应用程序可以在不同的环境中运行Loki是一个轻量级的日志聚合工具,它可以在Docker容器收集和存储大量的日志数据。Grafana是一个流行的数据可视化平台,它可以将Loki收集日志数据以图形化的方式展示出来。 使用Docker Loki Grafana,用户可以轻松地构建一个高度可扩展的日志分析平台。首先,用户可以使用Docker容器化技术将LokiGrafana部署在不同的服务器上,实现高可用和负载均衡。然后,在应用程序中配置Loki代理,使其将日志数据发送到Loki服务器进行集中存储。最后,用户可以使用Grafana创建仪表板,通过图表、指标和警报等方式,对收集到的日志数据进行可视化分析。 使用Docker Loki Grafana的好处是多方面的。首先,它可以大大简化日志收集和存储的过程,无需手动部署和配置复杂的日志收集工具。其次,Loki具有高度可扩展性和效率,可以处理大量的日志数据。此外,Grafana提供了强大的数据可视化功能,用户可以根据自己的需求自定义仪表板,轻松地监控和分析日志数据。 总之,Docker Loki Grafana是一种简便、高效且强大的日志聚合与可视化解决方案。它利用Docker容器化技术、Loki日志收集工具和Grafana数据可视化平台,为用户提供了一种简单且高效的方法来收集、存储、查询和可视化日志数据。无论是个人开发者还是企业用户,都可以从中受益,并更好地理解和优化自己的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值