前言

项目做正规了,日志系统是少不了的,目前大部分日志平台推荐基于 ELK 构建,不过 ELK 算是比较重了,架构太大,中小项目不太好 Hold 住,希望找一款简单一些的,如果实在找不到再上 ELK,这个时候一款名叫 Loki 的日志系统横空出世。Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。项目受 Prometheus 启发,官方的介绍就是:Like Prometheus, but for logs,类似于 Prometheus 的日志系统。

Loki日志体系

一、Loki 快速上手

Loki 作为日志系统的后起之秀,设计上可以说非常优秀,设计的理念就是为了让日志聚合更简单,它被设计为非常经济高效且易于操作。它不索引日志的内容,而是为每个日志流设置一组标签。它主要由三部分组成:

  • Promtail 是日志收集器,负责收集应用的日志并发送给 Loki

  • Loki 用于日志的存储和解析,并提供查询 API 给下游展示。

  • Grafana 负责将 Loki 的日志可视化。

Loki 流程图

与其他日志聚合系统相比,Loki具有下面的一些特性:

  • 不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。
  • 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
  • 特别适合储存 Kubernetes Pod 日志; 诸如 Pod 标签之类的元数据会被自动删除和编入索引。

简单上手

Loki 安装

首先是安装,现在跑 demo 我优先选择快捷方便的 Docker。下面是我修改过的 Docker Compose 脚本,根据自己的需要改改就能一键启动 Loki。

version: "3"networks:loki:services:loki:image: grafana/loki:2.2.1container_name: loki-servicevolumes:
#    将loki的配置文件挂载到本地 c:/docker/loki 目录- c:/docker/loki:/etc/loki/ports:- "3100:3100"command: -config.file=/etc/loki/loki.ymlnetworks:- lokipromtail:image: grafana/promtail:2.2.1container_name: promtail-servicevolumes:  #  为了读取本地的日志目录,这个是个默认配置目的就是为跑起来,生产肯定不是这样的。   - c:/docker/log:/var/log/#  promtail  的配置文件也挂载到本地 c:/docker/promtail目录  - c:/docker/promtail:/etc/promtail/command: -config.file=/etc/promtail/promtail.ymlnetworks:- lokigrafana:image: grafana/grafana:latestcontainer_name: grafana-serviceports:- "3000:3000"networks:- loki

上面的挂载目录 c:/docker/loki 和 c:/docker/promtail 可以根据自己的情况修改。

Loki 配置

上面文件中的 -config.file=/etc/loki/loki.yml 是 Loki 的配置文件,我们需要将配置文件 loki.yml 提前放在 c:/docker/loki 下,我使用默认配置:

auth_enabled: falseserver:http_listen_port: 3100ingester:lifecycler:address: 127.0.0.1ring:kvstore:store: inmemoryreplication_factor: 1final_sleep: 0schunk_idle_period: 1h       # Any chunk not receiving new logs in this time will be flushedmax_chunk_age: 1h           # All chunks will be flushed when they hit this age, default is 1hchunk_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 firstchunk_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 disabledschema_config:configs:- from: 2020-10-24store: boltdb-shipperobject_store: filesystemschema: v11index:prefix: index_period: 24hstorage_config:boltdb_shipper:active_index_directory: /loki/boltdb-shipper-activecache_location: /loki/boltdb-shipper-cachecache_ttl: 24h         # Can be increased for faster performance over longer query periods, uses more disk spaceshared_store: filesystemfilesystem:directory: /loki/chunkscompactor:working_directory: /loki/boltdb-shipper-compactorshared_store: filesystemlimits_config:reject_old_samples: truereject_old_samples_max_age: 168hchunk_store_config:max_look_back_period: 0stable_manager:retention_deletes_enabled: falseretention_period: 0sruler:storage:type: locallocal:directory: /loki/rulesrule_path: /loki/rules-tempalertmanager_url: http://localhost:9093ring:kvstore:store: inmemoryenable_api: true

Promtail 的配置

和 Loki 类似,Promtail 也要在本地挂载的 c:/docker/promtail目录下配置 promtail.yml,这里也使用默认配置:

server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /tmp/positions.yamlclients:- url: http://loki:3100/loki/api/v1/pushscrape_configs:- job_name: systemstatic_configs:- targets:- localhostlabels:job: varlogs# 这个跟挂载的位置有点关系,你可以猜猜__path__: /var/log/*log

我猜测 /var/log/*log 就是读取日志的位置,所以我把它挂载到本地 c:/docker/log,等下弄点日志到本地这个目录下,看看能读取出来不。

启动 Loki

配置完毕后执行 docker-compose -f <docker-compose.yml 路径> up 命令,会先下载镜像然后启动三个 Docker 容器。成功后打开 http://localhost:3000/ 登录 Grafana,默认账号密码是 admin/admin。然后在侧边栏添加数据源为 Loki。

然后点击 Log labels 就可以把当前系统采集的日志标签给显示出来,可以根据这些标签进行日志的过滤查询

然后配置 Loki 的 URL 为 http://loki:3100,然后点确定和测试,有绿色提示就表示成功了。

我们使用的是 Docker Compose,因此 hostname 是服务名称 loki。然后点击侧边栏一个指南针形状的图标 Explore,就进入日志的 UI 了,这时候啥也没有。

得造点日志,搞一个 Spring Boot 应用,然后在 application.yml 中配置日志选项,然后启动应用生成一些日志。

logging:file:# 弄到疑似Promtail的日志读取路径试试path: c:/docker/loglevel:org: debug

然后我输入了一个从文档中找到的查询日志的表达式(Loki query){filename="/var/log/spring.log"}, 文件名称去 c:/docker/log 下看是否有日志。

Loki 中查询展示 Spring Boot 日志

Promtail 日志代理

目前 Promtail 可以从两个来源跟踪日志:本地日志文件和 systemd 日志,我们上面演示的就是本地日志文件的加载,这种方式是目前我唯一能够使用的途径,另一种途径是通过 K8S 的服务发现能力。

Loki 流程图

如果在多个应用服务器上部署对应的多个 Promtail 守护程序就能监视多个应用的静态日志文件,并通过 Loki API 将日志推送到 Loki 中进行聚合式的管理。

Spring Boot 日志的部署拓扑

Promtail动态配置

我们只需要为 Loki 应用部署相关的 Promtail 守护程序即可。这里我仍然使用 Docker 对 Promtail 进行部署,不过我不能再使用默认配置了,这时的​​ config.yml​​ 应该是:

server:http_listen_port: 9080grpc_listen_port: 0positions:filename: /var/log/positions.yamlclient:url: http://${LOKI_HOST}:${LOKI_PORT}/loki/api/v1/pushscrape_configs:- job_name: systempipeline_stages:static_configs:- labels:app: ${APP_NAME}job: varlogshost: ${LOG_HOST}__path__: /var/log/*log

为了构建一个通用的配置,我将一些参数进行了动态化。这是 ​​Loki2.1+​​​ 版本提供的特性,可以使用​​ ${} 来引用环境变量,甚至你可以为其指定默认值​​ ${VAR:default_value}​​。但是你必须得知道为了开启这一特性需要在 Promtail 启动命令中添加选项​​ -config.expand-env​​。

Promtail Docker 镜像改造

根据这个我对 Promtail 的 Docker 镜像进行了改造,具体的 ​​Dockerfile​​ 为:

FROM grafana/promtail:2.2.1
LABEL AUTHOR = felord.cn
VOLUME ["/var/log/"]
EXPOSE 9080
ENV LOKI_HOST="localhost"
ENV LOKI_PORT=3100
ENV APP_NAME="APP"
ENV LOG_HOST="localhost"
COPY config.yml /etc/promtail/
CMD ["-config.file=/etc/promtail/config.yml", "-config.expand-env"]

你可以通过​​ docker build -t loki-promtail:1.0 .​​命令构建这个自定义 Promtail 镜像。基本的启动命令:

docker run -d  --name promtail-service --network loki -v c:/docker/log:/var/log/  -e LOKI_HOST=loki -e APP_NAME=SpringBoot  loki-promtail:1.0

其中挂载的目录​​ c:/docker/log​​​ 依然是应用的日志目录,​​LOKI_HOST ​​要保证能够同 Loki 服务器通信,无论你通过直连还是 Docker 网络(这里用了 Docker 网桥)。你可以可以使用 Docker Compose 将应用和 Promtail 进行捆绑,所有的 Promtail 将把对应的日志发往 Loki 进行集中式的管理。另外通过自定义的 ​​Label​​ 我们可以通过应用名称来搜索日志了。

二、Loki 语法

选择器

对于查询表达式的标签部分,将其包装在花括号中 {},然后使用键值对的语法来选择标签,多个标签表达式用逗号分隔,比如:

|=:日志行包含字符串
!=:日志行不包含字符串
|~:日志行匹配正则表达式
!~:日志行与正则表达式不匹配

1 # 精确匹配:|="2020-11-16 "
2 {app_kubernetes_io_instance="admin-service-test2-container-provider"}|="2020-11-16 "1 # 模糊匹配:|~"2020-11-16 "
2 {app_kubernetes_io_instance="admin-service-test2-container-provider"}|~"2020-11-16 "1 # 排除过滤:!=/!~ "数据中心"
2 {app_kubernetes_io_instance="admin-service-master-container-provider"}!="数据中心"
3 {app_kubernetes_io_instance="admin-service-master-container-provider"}!~"数据中心"1 # 正则匹配: |~ "()"
2 {app_kubernetes_io_instance="admin-service-master-container-provider"}!~"(admin|web)"
3 {app_kubernetes_io_instance="admin-service-master-container-provider"}|~"ERROR|error"

三、Loki 错误日志查看

先通过表达式查询出有错误的日志

再根据上下文查看异常堆栈信息

异常信息如下

如果行数不够,可以点击 Load 10 more,点击一次将会增加10行,左边将会显示 Found 20 rows,历史查询使用,选择历史查询记录,查询,默认保留7天查询记录

分屏功能使用,根据不同标签选择器查询不同的日志

根据标签选择器,自动刷新日志

四、范围查询

  • rate:计算每秒的条目数
  • count_over_time:计算给定范围内每个日志流的条目

1 # 三十分钟日志行记录
2 count_over_time({app_kubernetes_io_instance="admin-service-master-container-web"}[30m])
3
4 # 12h小时内出现错误的速率
5 rate({app_kubernetes_io_instance=~".*master-container.*"} |~ "ERROR|error" [12h])

五、集合运算

与vPromQL 一样,LogQL 支持内置聚合运算符的一个子集,可用于聚合单个向量的元素,从而产生具有更少元素但具有集合值的新向量:

  • sum:计算标签上的总和
  • min:选择最少的标签
  • max:选择标签上方的最大值
  • avg:计算标签上的平均值
  • stddev:计算标签上的总体标准差
  • stdvar:计算标签上的总体标准方差
  • count:计算向量中元素的数量
  • bottomk:通过样本值选择最小的k个元素
  • topk:通过样本值选择最大的k个元素
# 统计1个小时日志量最大的前10个服务
topk(10,sum(rate({app_kubernetes_io_instance=~".*master-container.*"}[60m])) by(container))# 统计最近6小时内错误日志计数
sum(count_over_time({app_kubernetes_io_instance=~".*master-container.*"}|~"ERROR"[6h])) by (container)

六、Loki Url 表达式

URL 如下:

 https://grafana-liwenliang.com/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22Loki%22,%7B%22expr%22:%22%7Bapp_kubernetes_io_instance%3D~%5C%22user-service-test2-container-provider%5C%22%7D%7C~%5C%222020-11-05%5C%22%7C~%5C%22ERROR%5C%22%7C~%5C%22.com.test.scrm.%5C%22%22,%22maxLines%22:5000%7D%5D

分析:

  • %7C 表示|
  • %5C%22 表示"
  • 时间:now-1h 可替换 now-1min或者 now-5min
  • 项目名称:user-service-test2-container-provider 可替换为 .test2-container. 或者 event-service-test2-container-provider
  • 查询日志:2020-11-05 可替换为 2020-11-04
  • 删除一个管道 %7C%5C%22ERROR%5C%22%7C%5C%22.com.dadi01.scrm.%5C%22 这一段删除
  • 最后生成的链接粘贴到浏览器访问

URL 加解密:

上述可通过 url 加解密生成最终查询 url 链接,进入指定网站中:https://www.sojson.com/encodeurl.html。

上例中解密如下:

 https://grafana-liwenliang.com/explore?orgId=1&left=["now-1h","now","Loki",{"expr":"{app_kubernetes_io_instance%3D~\"user-service-test2-container-provider\"}|~\"2020-11-05\"|~\"ERROR\"|~\".com.test.scrm.\"","maxLines":5000}]

根据自定义查询语句:

# 根据日期查询
https://grafana-liwenliang.com/explore?orgId=1&left=["now-1h","now","Loki",{"expr":"{app_kubernetes_io_instance=~\"user-service-test2-container-provider\\"}|~\"2020-11-18\\"","maxLines":5000}]
# 加密
https://grafana-liwenliang.com/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22Loki%22,%7B%22expr%22:%22%7Bapp_kubernetes_io_instance=~%5C%22user-service-test2-container-provider%5C%22%7D%7C~%5C%222020-11-18%5C%22%22,%22maxLines%22:5000%7D%5D# 根据服务名称查询
https://grafana-liwenliang.com/explore?orgId=1&left=["now-1h","now","Loki",{"expr":"{app_kubernetes_io_instance=~\"data-service-test2-container-provider\\"}|~\"2020-11-18\\"","maxLines":5000}]
# 加密
https://grafana-liwenliang.com/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22Loki%22,%7B%22expr%22:%22%7Bapp_kubernetes_io_instance=~%5C%22data-service-test2-container-provider%5C%22%7D%7C~%5C%222020-11-18%5C%22%22,%22maxLines%22:5000%7D%5D# 根据对应的数据库查询
https://grafana-liwenliang.com/explore?orgId=1&left=["now-1h","now","Loki",{"expr":"{app_kubernetes_io_instance=~\"data-service-test2-container-provider\\"}|~\"2020-11-18\\"|~\"databaseName:scrm_test\\"","maxLines":5000}]
## 加密
https://grafana-liwenliang.com/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22Loki%22,%7B%22expr%22:%22%7Bapp_kubernetes_io_instance=~%5C%22data-service-test2-container-provider%5C%22%7D%7C~%5C%222020-11-18%5C%22%7C~%5C%22databaseName:scrm_test%5C%22%22,%22maxLines%22:5000%7D%5D

加密好的url直接粘贴到浏览器中即可查询

七、Loki api

# 查询标签
curl -G -s "http://localhost:3100/loki/api/v1/labels" | jqcurl -G -s  "http://localhost:3100/loki/api/v1/labels" | jq .data[]
"__name__"
"app"
"app_kubernetes_io_component"
"app_kubernetes_io_instance"
"app_kubernetes_io_managed_by"
"app_kubernetes_io_name"
"app_kubernetes_io_version"
"chart"
"component"
"container"
"controller_revision_hash"
"filename"
"helm_sh_chart"
"heritage"
"job"
"k8s_app"
"name"
"namespace"
"pod"
"pod_template_generation"
"pod_template_hash"
"release"
"releaseRevision"
"statefulset_kubernetes_io_pod_name"
"stream"
"task" # 根据标签查询对应标签值
curl -G -s http://localhost:3100/loki/api/v1/label/<name>/values | jqcurl -G -s  "http://localhost:3100/loki/api/v1/label/app_kubernetes_io_instance/values" | jq .data[]
"admin-service-test2-container-provider"
"admin-service-test2-container-web"
"admin-service-uat-container-provider"
"admin-service-uat-container-web"
"data-service-test2-container-provider"
"data-service-uat-container-provider"
"domain-service-test2-container-provider"
"domain-service-uat-container-provider"
"equity-service-test2-container-provider"
"equity-service-uat-container-provider"
"event-service-test2-container-provider"
"event-service-uat-container-provider"
"gateway-service-test2-container-soul-bootstrap"
"gateway-service-uat-container-soul-bootstrap"
"job-admin-service-test2-container-executor"
"job-admin-service-test2-container-web"
"job-admin-service-uat-container-executor"
"job-admin-service-uat-container-web"
"kubernetes-dashboard"# 根据标签查询对应的日志
curl -G -s http://localhost:3100/loki/api/v1/query_range | jqcurl -G -s  "http://localhost:3100/loki/api/v1/query_range" --data-urlencode 'query={app_kubernetes_io_instance=~".*test2-container.*"}|~"ERROR|error"' | jq .data.result | jq .[].values[0][1]
"2020-11-18 18:08:17.149 DEBUG org.apache.coyote.http11.Http11NioProtocol - Processing socket [org.apache.tomcat.util.net.NioChannel@3bf51e7e:java.nio.channels.SocketChannel[connected local=admin-service-test2-container-web-686d7c459d-fzc7d/ remote=/]] with status [ERROR]\n"
"2020-11-18 18:10:18.876 DEBUG io.lettuce.core.protocol.RedisStateMachine - Decoded LatencyMeteredCommand [type=GET, output=ValueOutput [output=[B@cd9fe9e, error='null'], commandType=io.lettuce.core.protocol.AsyncCommand], empty stack: true\n"
"2020-11-18 18:07:03.967 DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with n

查询日志流

查询某个时间点日志:GET /loki/api/v1/query,示例:

http://192.168.15.139:30100/loki/api/v1/query?direction=BACKWARD&limit=1000&query=sum(rate({job="anychatlog"}[2d]))

参数说明:

  • query:要执行的LogQL查询
  • limit: 要返回的最大条目数
  • time: 查询的评估时间作为一个纳秒的 Unix 纪元。默认为现在。
  • direction:确定日志的排序顺序。支持的值为forward或backward。默认为backward

查询某个时间段日志:GET /loki/api/v1/query_range,示例:

http://192.168.15.139:30100/loki/api/v1/query_range?direction=BACKWARD&limit=1000&query={job="anychatlog"} &start=1641280408415000000&end=1641453208415000000&step=120

参数说明:

  • query:要执行的LogQL查询
  • limit: 要返回的最大条目数
  • start: 查询的开始时间,以纳秒 Unix 纪元表示。默认为一小时前。
  • end: 查询的结束时间,以纳秒 Unix 纪元表示。默认为现在。
  • step: 以duration格式或浮点秒数查询分辨率步长。duration指形式为 的 Prometheus 持续时间字符串[0-9]+[smhdwy]。例如,5m 表示持续时间为 5 分钟。默认为基于start和的动态值end。仅适用于产生矩阵响应的查询类型。
  • interval:这个参数是实验性的;请参阅步骤与间隔下的说明。只返回(或大于)指定间隔的条目,可以是duration格式或浮点数。仅适用于产生流响应的查询。
  • direction:确定日志的排序顺序。支持的值为forward或backward。默认为backward.

查询标签

查询标签列表:GET /loki/api/v1/labels

参数:

  • start: 查询的开始时间,以纳秒 Unix 纪元表示。默认为 6 小时前。
  • end: 查询的结束时间,以纳秒 Unix 纪元表示。默认为现在。

示例: http://192.168.15.139:30100/loki/api/v1/labels

查询标签值:查询给定时间跨度内给定标签的已知值列表 GET /api/prom/label/<name>/values

参数:

  • name: GET /loki/api/v1/label中的标签
  • start: 查询的开始时间,以纳秒 Unix 纪元表示。默认为 6 小时前。
  • end: 查询的结束时间,以纳秒 Unix 纪元表示。默认为现在。

示例:http://192.168.15.139:30100/loki/api/v1/label/job/values

匹配特定标签集列表

返回匹配特定标签集的时间序列列表:GET /loki/api/v1/series;POST /loki/api/v1/series

参数:

  • match[]=<series_selector>:选择要返回的日志流的标签。match[]必须至少提供一个参数。
  • start=: 开始时间戳。
  • end=: 结束时间戳。

示例:http://192.168.15.139:30100/loki/api/v1/series?start=1640922291907000000&end=1641527091908000000&match[]={host="192.168.11.123"}

删除日志流

说明:需要2.3.0以上版本的Loki,并按官方文档进行配置

删除日志流:POST loki_addr/loki/api/admin/delete?match[]

参数:

  • match[]:标签匹配器,用于标识要从中删除的流,必须至少提供一个参数
  • <series_selector>:查询参数
  • start:开始的时间戳
  • end:结束的时间戳
  • 204 响应表示成功。

示例:http://192.168.15.139:30100/loki/api/admin/delete?match[]={job="anychatlog"}

列出删除请求:GET /loki/api/admin/delete

示例:http://192.168.15.139:30100/loki/api/admin/delete

取消删除请求:POST /loki/api/admin/cancel_delete_request

示例:http://192.168.15.139:30100/loki/api/admin/cancel_delete_request?request_id=dad569a8

其它常用API

GET /ready:当 Loki 摄取器准备好接受流量时,返回 HTTP 200。如果在 Kubernetes 上运行 Loki/ready可以用作就绪探针。

POST /flush:将摄取器持有的所有内存块刷新到后备存储。主要用于本地测试。

POST /ingester/flush_shutdown:摄取器的关闭,特别是将始终刷新它持有的任何内存块。这有助于缩小启用 WAL 的摄取器,我们希望确保旧的 WAL 目录不是孤立的,而是刷新到我们的块后端。

GET /metrics:公开 Prometheus 指标。有关 导出的指标列表,请参阅 loki

GET /config:/config公开当前配置。可选的mode查询参数可用于修改输出。如果它具有该值,则diff仅返回默认配置和当前配置之间的差异。值defaults返回默认配置

GET /loki/api/v1/status/buildinfo:在 JSON 对象中公开构建信息。字段包括version,revision,branch,buildDate,buildUser,和goVersion。

注意:Loki http Api 官方说明 https://grafana.com/docs/loki/latest/api/。

Loki 学习总结(1)—— Loki 中小项目日志系统的不二之选相关推荐

  1. 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

    一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见 ...

  2. spring学习(7):加入log4g日志系统

    点击show dependencies popup 修改pom.xml文件 <?xml version="1.0" encoding="UTF-8"?&g ...

  3. 日志系统新贵,Loki到底优秀在哪里?

    点击关注公众号,利用碎片时间学习 总结下 loki 的优点 低索引开销 loki 和 es 最大的不同是 loki 只对标签进行索引而不对内容索引 这样做可以大幅降低索引资源开销 (es 无论你查不查 ...

  4. 分布式日志系统Graylog、Loki及ELK的分析和对比

    更多内容关注微信公众号:fullstack888 日志系列: 企业级日志平台新秀Graylog,比ELK轻量多了 日志系统新贵Loki,比ELK轻量多了 1. 为什么需要集中的日志系统? 在分布式系统 ...

  5. 轻量级日志系统Loki原理简介和使用

    前言 这篇文章应朋友的要求,让写一篇loki日志系统,咱定义不容辞 一定要好好写 开干! 现实中的需求 公司的容器云运行的应用或某一个节点出现了问题,解决的思路 问题首先被prometheus监控 1 ...

  6. 日志系统----Loki日志新贵

    Loki 一.Loki简介(译) 二.helm部署Loki 1.环境准备 2.helm部署Loki 三.grafana使用简单说明 一.Loki简介(译) Like Prometheus, but f ...

  7. 日志系统新贵Loki,确实比笨重的ELK轻

    来自:CSDN(作者:linkt1234) 原文链接: https://blog.csdn.net/Linkthaha/article/details/100575278 最近,在对公司容器云的日志方 ...

  8. 抛弃ELK!Loki日志系统详解!

    背景 最近,在对公司容器云的日志方案进行设计的时候,发现主流的ELK或者EFK比较重,再加上现阶段对于ES复杂的搜索功能很多都用不上最终选择了Grafana开源的Loki日志系统,下面介绍下Loki的 ...

  9. 日志系统新贵 Loki,真香!!

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.来源链接:https://blog.csdn.net/Linkthaha/ 最近,在对公司容器云 ...

最新文章

  1. Linux System Programming -- Appendix
  2. dropdownlist总是获取第一个值
  3. mysql 5.1 for linux_linux下安装mysql5.1.68
  4. 我的内核学习笔记4:sysfs学习
  5. DPDK lcore学习笔记
  6. 恕我直言,你可能误解了微服务
  7. docker入门实践之数据卷管理
  8. TypeScript笔记(1)——环境配置与第一个ts程序
  9. Thread was being aborted.(调试或执行较长时间的程序时发生的错误)
  10. Ananagrams (多种stl)
  11. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_17_常用的函数式接口_Function接口中的方法andThen...
  12. java域名获取ip_JAVA获得域名IP地址的方法
  13. 动态拨号云服务器安装Ubuntu系统使用说明
  14. efi分区能不能删除 win10_Win10删除了EFI分区:以下是恢复它的方法
  15. Error: Cannot find module ‘@/xxx‘
  16. 云计算和云服务区别是什么
  17. 碳纤维复合材料加固钢筋混凝土的极化作用
  18. win7没有计算机,Win7计算机上没有声音的解决方案
  19. C语言错误 error C2059
  20. android降噪算法,Android主动降噪功能

热门文章

  1. SDP最佳实践丨为室内亲子动物园注入新零售基因
  2. ABAP 生产订单的创建与修改函数
  3. 拓扑家族的“新贵”——管理型网络拓扑
  4. 精益看板方法从理论到实战 (5)—— 控制在制品数量(上)
  5. Jetson Xavier NX系统安装至 nvme 硬盘
  6. 利用Android手机破解微信加密数据库EnMicroMsg.db文件
  7. 企查查爬虫获取公司链接
  8. 一个链接直接curl可以访问,但是restTemplate访问不了
  9. 壞壞老婆VS傻傻老公
  10. 飞冰一个很不错的网站