网站建设公司 深圳,网站建设与用户需求分析,百度竞价登录入口,大型网站开发基本流程ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种exporter功能, 代替传统模式下需要安装xxxx_exporter插件才能采集指标的情况
ALG适合云原生, 拓展性强, 但是对于传统的日志收集是很支持(后续有Alloy采集本地日志log, gz等格式案例)
读写分离模式部署ALG
初始化文件夹和一些配置文件
初始化文件夹
# log日志存储
mkdir -p /data/alg/flog/logs/log
# 日志压缩文件存储
mkdir -p /data/alg/flog/logs/gz
# minio存储
mkdir -p /data/alg/minio创建nginx配置文件
vim /data/alg/nginx.confuser nginx;
worker_processes 5; # worker线程数events {worker_connections 1000; # 单个worker连接数
}http {# 使用Docker内置DNS解析服务名, DNS缓存有效期10秒resolver 127.0.0.11 valid10s;# 开启访问日志, 生产中建议关闭access_log on;# 定义上游Loki writer服务器组upstream loki_writers {server write:3100;# 保持长连接池keepalive 32;}# 定义上游Loki reader服务器组upstream loki_readers {server read:3100;keepalive 32;}# 定义上游alloy服务器组upstream alloys {server alloy:12345;}# Grafana UIserver {listen 3000;location / {proxy_pass http://grafana:3000;# 代理设置请求头, 否则Grafana会提示一直登录# 并且要设置WebSocket, 否则无法运行实时跟踪# 见https://blog.csdn.net/weixin_41287260/article/details/134630447# https://www.cnblogs.com/hahaha111122222/p/16407564.htmlproxy_set_header Upgrade $http_upgrade;proxy_set_header Connection upgrade;proxy_set_header Host $http_host;}}# Loki相关日志推送, 存储等配置server {# 监听容器内 3100 端口通过 ports 映射到宿主机 3100启用端口复用提升性能listen 3100 reuseport;# 定义写入类请求的通用配置块location ~ ^/(api/prom/push|loki/api/v1/push) {proxy_pass http://loki_writers$request_uri;proxy_http_version 1.1;proxy_set_header Connection ;}# 定义实时日志流式传输tail请求的通用配置块location ~ ^/(api/prom/tail|loki/api/v1/tail) {proxy_pass http://loki_readers$request_uri;proxy_read_timeout 3600s;# 这里必须要配置WebSocket, 否则无法运行实时跟踪proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection upgrade;}# 定义所有 Prometheus 格式和 Loki 原生格式查询请求的通用配置块location ~ ^/(api/prom/.*|loki/api/.*) {proxy_pass http://loki_readers$request_uri;proxy_http_version 1.1;proxy_set_header Connection ;# 缓存查询结果10秒proxy_cache_valid 200 10s;}}# read 端点, 生产中应该禁外界访问(这里做演示, 所以开放), 容器内部通信即可server {listen 3101;location / {proxy_pass http://loki_readers/ready;}}# write 端点, 生产中禁外界访问(这里做演示, 所以开放), 容器内部通信即可server {listen 3102;location / {proxy_pass http://loki_writers/ready;}}# Minio UIserver {listen 9001;location / {proxy_pass http://minio:9001;# 添加websocket支持, 否则Minio会卡主, 页面一直loading# 见https://blog.csdn.net/qq_25231683/article/details/128734555proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection upgrade;proxy_set_header Host $http_host;}}# Alloy UIserver {listen 12345;location / {proxy_pass http://alloys;}}
}创建alloy配置文件
vim /data/alg/alloy-local-config.yaml//
// 实时调试
//
livedebugging {enabled true
}//
// Docker容器日志发现和采集
//
// Docker 容器发现配置
discovery.docker flog_scrape {// 连接 Docker daemon 的地址Unix 套接字host unix:///var/run/docker.sock // 每5s抓取Docker信息日志refresh_interval 5s
}// 主要用于服务发现阶段对发现的目标如容器、节点等的元数据标签进行预处理。当通过服务发现机制如基于 Docker、Kubernetes 等发现一系列目标时这些目标会带有各种元数据标签这里可以对这些原始标签进行修改、添加、删除等操作使得标签更加符
discovery.relabel flog_scrape {// 初始空目标列表自动从上游发现discovery.docker flog_scrape填充targets [] // 提取容器名称rule {// 原始元数据标签来自 Docker 的属性source_labels [__meta_docker_container_name] // 正则提取容器名称去除路径前缀regex /(.*) // 生成新标签 container 存储处理结果target_label container}// 提取项目名rule {//source_labels [__meta_docker_container_label_com_docker_compose_project]regex (.*) target_label project }
}// Loki Docker 日志采集配置
loki.source.docker flog_scrape {// Docker 连接配置需与发现模块一致host unix:///var/run/docker.sock // 要从中读取日志的容器列表, 关联发现模块获取的目标列表targets discovery.docker.flog_scrape.targets // 日志转发目的地指向写入模块forward_to [loki.write.default.receiver] // 应用标签重写规则relabel_rules discovery.relabel.flog_scrape.rules // 目标同步频率与发现模块同步refresh_interval 5s
}//
// *.log文件匹配和采集
//
// 本地*.log文件匹配
local.file_match local_log {path_targets [{__path__ /data/alg/flog/logs/log/*.log},]
}//
// 本地*.log文件采集
//
loki.source.file local_log {// 关联发现模块获取的目标列表, 关联到本地机器日志匹配targets local.file_match.local_log.targets// 日志转发目的地指向写入模块forward_to [loki.write.default.receiver]
}//
// *.gz文件匹配和采集
//
// 本地*.gz文件匹配
local.file_match local_log_gz {path_targets [{__path__ /data/alg/flog/logs/gz/*.gz},]
}// 本地*.log文件采集
loki.source.file local_log_gz {// 关联发现模块获取的目标列表, 关联到本地机器日志匹配targets local.file_match.local_log_gz.targets// 日志转发目的地指向写入模块forward_to [loki.write.default.receiver]// 解压缩decompression {// 是否启用解压缩enabled true// 开始从新的压缩文件读取之前要等待的时间initial_delay 10s// 使用的压缩格式Gzipformat gz}
}//
// Loki 日志写入配置
//
loki.write default {// 将日志发送到的位置endpoint {// 要将日志发送到的完整 URL, Loki 接收端 API 地址url http://gateway:3100/loki/api/v1/push// 发送前要累积的最大日志批次大小batch_size 1MiB// 发送批次前要等待的最长时间batch_wait 1s// 多租户标识生产环境建议动态获取tenant_id tenant1}// 附加全局标签当前为空配置external_labels {}
}创建loki配置文件
vim /data/alg/loki-config.yaml#
# Loki 服务核心配置
#
server:http_listen_address: 0.0.0.0 # 监听所有网络接口http_listen_port: 3100 # 默认 Loki 服务端口#
# 集群节点发现与通信配置
#
memberlist:join_members: [read, write, backend] # 需要连接的初始节点列表建议使用IP或DNSdead_node_reclaim_time: 30s # 节点标记为死亡后保留元数据的时间gossip_to_dead_nodes_time: 15s # 停止向死亡节点发送gossip包的时间left_ingesters_timeout: 30s # 离开节点清理超时时间bind_addr: [0.0.0.0] # 集群通信绑定地址bind_port: 7946 # 集群通信端口gossip_interval: 2s # 节点状态同步间隔#
# 数据存储架构配置
#
schema_config:configs:- from: 2023-01-01 # 配置生效起始时间store: tsdb # 使用 Prometheus TSDB 存储object_store: s3 # 对象存储类型schema: v13 # 存储格式版本index:prefix: index_ # 索引文件前缀period: 24h # 索引文件切割周期#
# 公共基础配置
#
common:path_prefix: /loki # 存储路径前缀replication_factor: 1 # 数据副本数生产环境建议 3compactor_address: http://backend:3100 # 压缩组件地址# 对象存储配置storage:# S3对象存储s3:endpoint: minio:9000 # S3兼容存储地址insecure: true # 禁用HTTPS生产环境不推荐bucketnames: loki-data # 主数据存储桶access_key_id: whiteBrocade # 访问密钥建议使用环境变量secret_access_key: whiteBrocade # 密钥存在安全隐患s3forcepathstyle: true # 强制路径访问模式# 本地文件存储(由于是容器形式启动loki, 这里指的是容器内系统)#filesystem:# # 数据保存的地方# chunks_directory: /tmp/loki/chunks# # 规则保存的地方# rules_directory: /tmp/loki/rules# 一致性哈希环配置ring:kvstore:store: memberlist # 使用memberlist实现分布式哈希环#
# 告警规则配置
#
ruler:storage:s3:bucketnames: loki-ruler # 独立存储告警规则的桶#
# 数据压缩配置
#
compactor:working_directory: /tmp/compactor # 临时工作目录建议使用持久化存储docker-compose文件
ALG loki使用的是读写分离模式部署, 拆分成了read, write, backend三个组件存储使用的Minio, 生产中建议对存储日志的桶设置过期策略, 减少存储成本使用ng作为网关统一入口, 有些端口生产中不应该开放, 比如说loki的read和write的read访问 version: 3.8
#
# 自定义网络配置
#
networks:loki: # 创建专用网络确保服务隔离driver: bridgeservices:# # Loki 读取组件查询节点# read:image: grafana/loki:latest# 容器名container_name: loki-read# 指定read模式启动command: -config.file/etc/loki/config.yaml -targetread # 指定角色为读取节点ports:- 3100 # 映射外部访问端口- 7946 # memberlist 通信端口- 9095 # 指标暴露端口未映射到宿主机volumes:- /data/alg/loki-config.yaml:/etc/loki/config.yaml # 共享配置文件healthcheck: # 健康检查策略test: [CMD-SHELL, # 使用 shell 执行命令wget --no-verbose --tries1 --spider http://localhost:3100/ready || exit 1]interval: 10s # 每10秒检查一次timeout: 5s # 超时时间5秒retries: 5 # 最多重试5次depends_on: # 依赖Minio- minio# 定义网络锚点, 后续直接复用networks: loki-dns # 网络别名锚点loki:aliases:- loki # 其他服务可通过 loki 域名访问# # Loki 写入组件接收节点# write:image: grafana/loki:latest# 容器名container_name: loki-write# 指定write模式启动command: -config.file/etc/loki/config.yaml -targetwriteports:- 3100 # 与读节点区分端口- 7946 # memberlist 通信端口- 9095 # 指标暴露端口未映射到宿主机volumes:- /data/alg/loki-config.yaml:/etc/loki/config.yamlhealthcheck: # 健康检查策略test: [CMD-SHELL, # 使用 shell 执行命令wget --no-verbose --tries1 --spider http://localhost:3100/ready || exit 1]interval: 10s # 每10秒检查一次timeout: 5s # 超时时间5秒retries: 5 # 最多重试5次depends_on: # 依赖Minio- minionetworks:: *loki-dns # 复用网络别名配置# # Loki 后台处理组件# backend:image: grafana/loki:latest# 容器名container_name: loki-backendcommand: -config.file/etc/loki/config.yaml -targetbackend -legacy-read-modefalseports:- 3100 # 默认API端口未映射到宿主机- 7946 # memberlist端口volumes:- /data/alg/loki-config.yaml:/etc/loki/config.yamlnetworks:- loki# # 日志采集组件原Grafana Agent# alloy:image: grafana/alloy:latest# 容器名container_name: alloycommand: run --server.http.listen-addr0.0.0.0:12345 --storage.path/var/lib/alloy/data /etc/alloy/config.alloyports:- 12345 # Web UI端口volumes:# 将程序产生的*.log,*.gzd的父目录映射到alloy, 这样才能探测到- /data/alg/flog/logs:/data/alg/flog/logs- /data/alg/alloy-local-config.yaml:/etc/alloy/config.alloy:ro # 采集配置- /var/run/docker.sock:/var/run/docker.sock # 挂载docker socket, 如果不挂载这个, 那么没法获取到容器的日志networks:- loki# # 对象存储服务S3兼容# minio:image: minio/minio:latest# 容器名container_name: minioentrypoint: # 初始化存储目录- sh - -euc # 执行脚本的参数e(报错退出) u(未定义变量报错) c(执行后续命令)- | # 多行脚本开始, minio创建目录挂载日志mkdir -p /data/loki-data \mkdir -p /data/loki-ruler \minio server /data --console-address :9001environment:- MINIO_ROOT_USERwhiteBrocade # 用户名与Loki配置对应- MINIO_ROOT_PASSWORDwhiteBrocade # 密码需加密处理- MINIO_PROMETHEUS_AUTH_TYPEpublic # 开放指标volumes:- /data/alg/minio:/data # 持久化存储路径ports:- 9000 # API端口- 9001 # UI端口networks:- loki# # 可视化平台# grafana:image: grafana/grafana-enterprise:latest# 容器名container_name: grafana# 数据持久化environment:- GF_AUTH_ANONYMOUS_ENABLEDtrue # 开启匿名访问生产环境应关闭# 设置 Grafana 的管理员admin账户的初始密码为admin - GF_SECURITY_ADMIN_PASSWORDadmin# 设置Grafana的语言为简体中文- GF_VIEWER_LANGUAGEzh-Hans# 设置 Grafana 的默认用户界面主题为暗黑模式- GF_USERS_DEFAULT_THEMEdark- GF_PATHS_PROVISIONING/etc/grafana/provisioningentrypoint: # 覆盖默认启动命令, 动态创建Loki数据源配置- sh- -euc # 执行脚本的参数- | # 多行脚本开始mkdir -p /etc/grafana/provisioning/datasourcescat EOF /etc/grafana/provisioning/datasources/ds.yamlapiVersion: 1# 初始化Loki数据源datasources:- name: Loki # 显示在UI中的名称type: loki # 数据源类型access: proxy # 通过Grafana服务代理访问url: http://gateway:3100 # 通过NG网关访问jsonData:httpHeaderName1: X-Scope-OrgID # # 多租户头部名称secureJsonData:httpHeaderValue1: tenant1 # 租户IDEOF/run.shports:- 3000 # Web访问端口depends_on: # 依赖网关服务- gatewaynetworks:- loki# # API网关流量路由# gateway:image: nginx:latest# 容器名container_name: nginxvolumes:- /data/alg/nginx.conf:/etc/nginx/nginx.confports:- 3000:3000 # Grafana UI- 3100:3100 # Loki统一入口端口- 3101:3101 # read 端点- 3102:3102 # write 端点- 9001:9001 # Minio UI- 12345:12345 # Alloy UIhealthcheck: # 健康检查策略test: [CMD, service, nginx, status]interval: 10stimeout: 5sretries: 5depends_on:- read- write- alloynetworks:- lokiALG相关访问路径 启动ALG Grafana UI 访问地址(这里换成你自己的IP): http://192.168.132.10:3000 账号: admin 密码: admin Minio UI
访问地址(这里换成你自己的IP): http://192.168.132.10:9001账号: whiteBrocade密码: whiteBrocade Grafana Alloy UI
访问地址(这里换成你自己的IP): http://192.168.132.10:12345 Loki Read/Write组件
Read访问地址(这里换成你自己的IP): http://192.168.132.10:3101Write访问地址(这里换成你自己的IP): http://192.168.132.10:3102 Flog 使用flog生成日志, 模拟三种情况 Docker容器日志本地*.log日志本地*.log.gz version: 3.8
services:# # log 是一个由 mingrammer 开发的开源项目主要用于生成常见的日志格式如 Apache 通用日志、Apache 错误日志和 RFC3164 系统日志# 日志会输出到 容器内部的标准输出(stdout)# flog-stdout:image: mingrammer/flog:latest# 容器名container_name: flog-stdout# -f json:日志格式, 这里指定为json# -d 200ms: 日志产生的速度# -t stdout: 输出类型为标准输出# -l: 无限循环生成日志command: -f json -d 200ms -t stdout -l# 这里的日志持久化, 用于应用程序产生的*.log日志以及压缩日志flog-log:image: mingrammer/flog:latest# 容器名container_name: flog-log# -f json:日志格式, 这里指定为json# -d 200ms: 日志产生的速度# -t log: s输出类型为log日志# -l: 无限循环生成日志# -w: 覆盖已存在的日志文件# -o /data/logs/test.log: 将日志输出到文件中# -p 1048576: 当日志文件达到1MB的时候就会分割日志# -b 10485760 该路径下/data/logs/*.log最多生成10MBcommand: -f json -d 200ms -l -t log -w -o /data/logs/test.log -p 1048576 -b 10485760# 将日志映射到宿主机上, 模拟非容器环境部署程序产生的日志文件volumes:- /data/alg/flog/logs/log:/data/logsflog-gz:image: mingrammer/flog:latest# 容器名container_name: flog-gz# -f json:日志格式, 这里指定为json# -t gz: 输出类型为gzip文件# -l: 无限循环生成日志# -w: 覆盖已存在的日志文件# -o /data/logs/test.log.gz: 将日志输出到test.log.gz# -p 1048576: 当日志文件达到1MB的时候就会分割日志# -b 10485760 该路径下/data/logs/*.gz最多生成10MBcommand: -f json -l -t gz -w -o /data/logs/test.log.gz -p 1048576 -b 10485760# 将日志映射到宿主机上, 模拟非容器环境部署程序产生的日志文件volumes:- /data/alg/flog/logs/gz:/data/logs启动Flog容器, 如下图 效果
容器日志查看
访问http://192.168.132.10:3000的Grafana面板, 选择Expore, 查看Nginx容器的日志 日志如下 log日志和log.gz日志查看
访问http://192.168.132.10:3000, 通过filename标签(这个标签是alloy内置自动添加的)查看log日志 查看gz格式的压缩日志 Alloy代替Node Exporter方式采集主机信息
alloy除了可以用于收集日志, 还可以采集主机信息, 发送给Prome
参考资料
ALG
博客
Grafana 系列文章一基于 Grafana 的全栈可观察性 Demo
Grafana Loki 简要指南关于标签您需要了解的一切
开源日志监控Grafana Loki 简要指南
日志之Loki详细讲解
使用读写分离模式扩展 Grafana Loki Loki部署模式 grafana loki的理解与配置(2.9) 轻量级日志系统docker-compose搭建LokiGrafanaPromtail配置、部署查询全流程 轻量级日志系统-Loki
轻量级日志系统笔记ALG
开源项目推荐flog 推荐一个小工具flog 探索Flog伪装日志流量的神器 gitcode的flog项目
Docker 环境中配置 Grafana详细教程与常见配置项解析
项目集成grafana,并用非root用户启动
在docker-compose启动grafana,出现权限错误的解决方案
Docker上的Grafana 7.3.0存在权限问题
grafana重启后模板没有数据了 grafana新建dashboard
Docker安装grafana数据持久化配置SMTP
springbootLokiLoki4jGrafana搭建轻量级日志系统
视频
【IT老齐636】Grafana Loki vs ELK
【IT老齐710】Grafana ALG分布式日志收集架构
【IT老齐711】ALG收集Docker所有实例运行日志
GrafanaLokiAlloy快速构建企业日志系统
k8s loki 日志解决方案 (持续更新中)
Loki日志系统-安装、使用、告警