网易首页 > 网易号 > 正文 申请入驻

Loki日志全链路实战:从收集到告警的完整指南

0
分享至

新钛云服已累计为您分享836篇技术干货

01

为什么选择Loki ?

传统日志系统的痛点

  • 资源消耗高:ELK(Elasticsearch)需要为全文检索建立复杂索引,存储成本飙升,官方数据是通常可以将数据压缩20%~30%,实测下来在某些场景下可以达到50%,使用DEFLATE压缩算法,最低可以降低超过70%

  • 云原生适配差:Kubernetes动态环境下的日志标签管理困难


Loki的核心优势

  • 轻量级设计:仅索引元数据(标签),有近10倍的压缩比,5G数据输入存储实际增长0.5G。

  • 无缝集成:原生支持Prometheus生态,原生集成grafana,支持集群本身监控告警和日志监控告警。

  • 动态标签:完美适配Kubernetes Pod/Node等动态资源标签

02

Loki架构解析

核心组件与数据流

Loki则采用了分布式架构,将日志数据存储在多个节点上,Promtail进行日志收集,可视化依赖于Grafana。


关键概念解析

03

部 署

环境准备

  • 硬件建议:

    • 生产环境:至少3节点集群(每个节点4核8GB+)

    • 存储:优先选择SSD + S3兼容存储(MinIO)

  • 版本选择:

推荐使用v2.8+版本
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update


Kubernetes集群部署

使用Helm部署Loki Stack(包含Promtail)
helm upgrade --install loki grafana/loki-stack \
  --set promtail.enabled=true \
  --set loki.persistence.enabled=true \
  --set loki.persistence.size=100Gi


Promtail配置示例

#promtail-config.yaml
server:
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
url: http://loki:3100/loki/api/v1/push

scrape_configs:
job_name: kubernetes
kubernetes_sd_configs:
role: pod
  pipeline_stages:
docker: {}
  relabel_configs:
source_labels: [__meta_kubernetes_pod_label_app]
  target_label: app

04

告警集成

grafana告警规则配置

05

性能优化与分析实践

存储优化技巧

#loki-config.yaml 优化片段
schema_config:
  configs:
    - from: 2023-01-01
      store: boltdb-shipper
      object_store: s3
      schema: v11
      index:
        prefix: index_
        period: 24h

chunk_store_config:
  max_look_back_period: 720h # 日志保留30天


日志查询和分析


  1. 首先,指定 查询文件 filename="/usr/local/nginx/logs/loki-error.log"

  2. 然后,通过json的方式

  3. 最后,设置条件选择,比如status=500、server_name=test.com


查询加速策略

  1. 预过滤标签


#先通过精确标签缩小范围
{cluster="aws", pod=~"frontend-.+"} |= "timeout"


  1. 避免全文本扫描:优先使用|=(包含)而非|~(正则)

06

真实场景案例

案例1:nginx5xx日志收集

重新编译nginx

#上传安装包
nginx-1.25.3.tar.gz、ngx_http_geoip2_module-3.4.tar.gz、libmaxminddb-1.9.1.tar.gz、GeoLite2-City.mmdb、GeoLite2-Country.mmdb

#nginx重新编译
./configure --prefix=/usr/local/nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-dynamic-module=/root/nginx/ngx_http_geoip2_module-3.4 


修改日志格式

load_module modules/ngx_http_geoip2_module.so;
#修改日志格式
  log_format json_analytics escape=json '{'
                    '"msec": "$msec", ' 
                    '"connection": "$connection", '
                    '"connection_requests": "$connection_requests", ' 
                    '"http_referer": "$http_referer", '
                    '"http_user_agent": "$http_user_agent", ' 
                    '"request_method": "$request_method", '
                    '"server_protocol": "$server_protocol", '
                    '"status": "$status", '
                    '"pipe": "$pipe", ' 
                    '"server_name": "$server_name", '
                    '"request_time": "$request_time", ' 
                    '"gzip_ratio": "$gzip_ratio", '
                    '"http_cf_ray": "$http_cf_ray",'
                    '"geoip_country_code": "$geoip2_data_country_code",'
                    '"geoip2_city_name_en": "$geoip2_city_name_en", '
                    '"geoip2_city_name_cn": "$geoip2_city_name_cn", '
                    '"geoip2_longitude": "$geoip2_longitude", '
                    '"geoip2_latitude": "$geoip2_latitude"'
                    '}';
    map $http_x_forwarded_for $real_ip {
        default "";
        "~^(?P \d+\.\d+\.\d+\.\d+)"  $ip;
        "~^(?P \d+\.\d+\.\d+\.\d+),.*"  $ip;
    }
#指定日志的位置,会放在nginx目录下
    map $status $log_path {
        ~^4       /logs/loki-error.log;
        ~^5       /logs/loki-error.log;
        default   /logs/access.log;
    }
    geoip2 /usr/local/nginx/modules/GeoLite2-Country.mmdb {
        auto_reload 5m;
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_code source=$real_ip country iso_code;
        $geoip2_data_country_name country names zh-CN;
    }

    geoip2 /usr/local/nginx/modules/GeoLite2-City.mmdb {
         $geoip2_city_name_en source=$real_ip city names en;
         $geoip2_city_name_cn source=$real_ip city names zh-CN;
         $geoip2_longitude source=$real_ip location longitude ;
         $geoip2_latitude source=$real_ip location latitude ;
    }
    fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
    fastcgi_param COUNTRY_NAME $geoip2_data_country_name;
    fastcgi_param CITY_NAME    $geoip2_city_name_cn;    check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;
    check_http_send "HEAD /health/check/status HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;


配置promtail收集

cat << EOF >> /data/promtail/config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
url: http://192.168.119.191:3100/loki/api/v1/push

scrape_configs:
job_name: nginx
static_configs:
targets:
localhost
    labels:
    job: nginx
    host: $host
    agent: promtail
    path    : /usr/local/nginx/logs/loki-error.log
EOF


结合grafana呈现效果


案例2:数据库慢查询收集

配置promtail收集

cat config.yaml 
server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
clients:
url: http://192.168.119.191:3100/loki/api/v1/push
scrape_configs:
    - job_name: mysql-slowlogs
      static_configs:
        - labels:
            instance: usa4-rds03-slave
            projectname: chat
            job: mysql
            __path__: /database/mysql/1266/mysql-slow.log
      pipeline_stages:
        - multiline:
              firstline: '#\sTime:.'
        - regex:
*              expression: '#\s*Time:\s*(?P .*)\n#\s * User @Host:\s *( ? P [ ^\[] +) .*@\s *( ? P .*]) .*** Id:\s ***( ? P \d +)\n#\s * Query_time:\s *( ? P \d +\.\d +)\s * Lock_time:\s *( ? P \d +\.\d +)\s * Rows_sent:\s *( ? P \d +)\s * Rows_examined:\s *( ? P \d +)\n( ? P ( ?s: .*))$'
        - labels:
            timestamp:
            user:
            host:
            id:
            query_time:
            lock_time:
            rows_sent:
            rows_examined:
            query:
        - drop:
            expression: "^ *$"
            drop_counter_reason: "drop empty lines"


结合grafana呈现效果

07

总 结

总体而言,Loki相对轻量级,具有较高的可扩展性和简化的存储架构,但需要额外的组件,Loki使用的是自己的查询语言LokiQL,有一定的学习曲线。若是数据量适中,数据属于时序类,如应用程序日志和基础设施指标,并且应用使用kubernetes Pod形式部署,则选择Loki比较合适。

Loki正在成为云原生时代日志管理的标准解决方案,其与以下技术的整合值得关注:

  • OpenTelemetry:统一日志、指标、追踪的采集标准

  • WALWrite-Ahead Logging:提升高吞吐场景下的可靠性

  • 边缘计算:轻量级特性适合IoT设备日志收集

如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。

附录

参考文章:

https://www.ctyun.cn/developer/article/418138645577797

http://cloud.tencent.com/developer/article/2241079

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
收入暴跌生活拮据,前曼城后卫门迪拍卖世界杯冠军奖杯复制品

收入暴跌生活拮据,前曼城后卫门迪拍卖世界杯冠军奖杯复制品

星耀国际足坛
2026-07-31 23:33:17
“只顾自己纹眉,不管女儿死活?”14岁女孩生日照,脸上全是槽点

“只顾自己纹眉,不管女儿死活?”14岁女孩生日照,脸上全是槽点

泽泽先生
2026-04-18 22:17:16
陪玩陪睡只是皮毛!继手伸进裤子后,又一女星自曝,50多都不放过

陪玩陪睡只是皮毛!继手伸进裤子后,又一女星自曝,50多都不放过

不似少年游
2026-06-22 19:32:51
国家发改委:近期,正在会同有关部门抓紧研究制定扩大内需战略实施方案(2026-2030年)

国家发改委:近期,正在会同有关部门抓紧研究制定扩大内需战略实施方案(2026-2030年)

政知新媒体
2026-07-31 11:59:46
以媒:以色列一军事基地超百名士兵“抗命”离营

以媒:以色列一军事基地超百名士兵“抗命”离营

新华社
2026-07-31 06:53:01
美股存储芯片股跳水,闪迪从涨超10%到跌超6%

美股存储芯片股跳水,闪迪从涨超10%到跌超6%

21世纪经济报道
2026-07-31 23:11:19
员工卡点下班被领导在大群通报批评罚500,当场转1000反问敢不敢收,领导瞬间哑火!

员工卡点下班被领导在大群通报批评罚500,当场转1000反问敢不敢收,领导瞬间哑火!

一丝不苟的法律人
2026-07-29 12:35:47
皇马20岁21场16球前锋放弃假期,提前归队,想给穆帅留下深刻印象

皇马20岁21场16球前锋放弃假期,提前归队,想给穆帅留下深刻印象

福酱的小时光
2026-07-31 07:48:04
防暑预警:从8月1日晚上开始,今年夏天不一样,早做准备少遭罪

防暑预警:从8月1日晚上开始,今年夏天不一样,早做准备少遭罪

叙说医疗健康
2026-08-01 05:00:15
董宇辉称《大话西游》观看不下500遍?知名编剧怒骂:要么学者,要么带货的

董宇辉称《大话西游》观看不下500遍?知名编剧怒骂:要么学者,要么带货的

火山詩话
2026-07-31 08:21:06
日本熊本地震 便利店杯面扫光但一款无人问津 网民:震灾下更不敢试

日本熊本地震 便利店杯面扫光但一款无人问津 网民:震灾下更不敢试

环球趣闻分享
2026-07-31 14:40:10
中日关系已逼近危险临界点,东海局势升温,战争不再只是纸上谈兵

中日关系已逼近危险临界点,东海局势升温,战争不再只是纸上谈兵

安安说
2026-06-07 10:57:28
美国制造的“光鱼”(Lightfish)无人艇抵近“偷拍”我们的052D型驱逐舰

美国制造的“光鱼”(Lightfish)无人艇抵近“偷拍”我们的052D型驱逐舰

健身狂人
2026-08-01 06:41:09
24小时内连炸三座“野莓”仓库,乌克兰要干什么?

24小时内连炸三座“野莓”仓库,乌克兰要干什么?

山河路口
2026-07-30 20:43:50
局势失控,外资纷纷撤离,正副总统同台断交,印尼政坛迎来大清洗

局势失控,外资纷纷撤离,正副总统同台断交,印尼政坛迎来大清洗

凡知
2026-07-30 23:12:05
里奇·保罗谈勒布朗·詹姆斯,未能与文班亚马合作加盟马刺的原因

里奇·保罗谈勒布朗·詹姆斯,未能与文班亚马合作加盟马刺的原因

好火子
2026-07-31 23:02:03
已致36人死亡6人重伤,日本熊本“黄金72小时”已过:余震300次,近万人仍避难

已致36人死亡6人重伤,日本熊本“黄金72小时”已过:余震300次,近万人仍避难

上观新闻
2026-08-01 06:37:01
小龙虾,迎来最冷的夏天

小龙虾,迎来最冷的夏天

餐饮老板内参
2026-07-31 15:26:51
孙颖莎舅舅接机火了!一个动作看哭网友,这才是顶级宠爱!

孙颖莎舅舅接机火了!一个动作看哭网友,这才是顶级宠爱!

手工制作阿歼
2026-08-01 07:27:34
“莫氏鸡煲”上综艺首轮被淘汰,录节目几天出场仅3分钟!谢霆锋点评:“鸡很好,汤很好喝”

“莫氏鸡煲”上综艺首轮被淘汰,录节目几天出场仅3分钟!谢霆锋点评:“鸡很好,汤很好喝”

每日经济新闻
2026-07-30 18:23:31
2026-08-01 07:56:49
新钛云服
新钛云服
云管理服务专家
481文章数 30关注度
往期回顾 全部

科技要闻

DeepSeek又更新了,这次梁文锋没放大招

头条要闻

国家电网原董事长辛保安被官宣落马 行业会议后被带走

头条要闻

国家电网原董事长辛保安被官宣落马 行业会议后被带走

体育要闻

欧足联掀桌!因凡蒂诺这次真玩大了?

娱乐要闻

百花奖影帝影后即将决出

财经要闻

华强北显卡涨价潮 有显卡一周暴涨4000元

汽车要闻

听劝!换回机械门把手,这才是碳基生物该开的车!

态度原创

艺术
本地
亲子
房产
公开课

艺术要闻

400年前古画爆红:明代顶级富豪的生活,高级得从不炫富

本地新闻

神仙也“蓉”漂,哪吒与八仙,皆是成都出品!

亲子要闻

境界压制之生活费,太逗了

房产要闻

1700亿砸下!信息量巨大!海南甩出又一个超级规划!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版