如何将Heroku应用日志推送至Grafana Cloud的Grafana-Loki服务
Heroku JavaScript应用接入Grafana Loki实操指南
你找到的push-to-loki.py核心逻辑只有3步:收集日志内容→按Loki要求的格式组装请求→携带认证信息推送到Grafana Cloud的Loki接口,不需要完全读懂所有代码,按下面步骤修改即可快速落地:
前置准备
先提前准备好3个Grafana Cloud的Loki配置参数,后续所有配置都要用到:
- Loki实例推送端点URL
- Loki实例用户名(一般为数字ID)
- Grafana Cloud API密钥(需要有Loki写入权限)
最简适配方案(无需修改JS应用代码,推荐基础薄弱用户使用)
这种方案直接把Python脚本作为JS应用的日志管道,改3个地方就能用:
- 把下载的
push-to-loki.py里的配置变量替换为你自己的Loki参数:
# 以下3个变量替换为自己的配置 LOKI_PUSH_URL = "你的Loki推送端点,格式为https://<集群地址>/loki/api/v1/push" LOKI_USERNAME = "你的Loki实例ID" LOKI_API_KEY = "你生成的Grafana Cloud API密钥" # 新增标签用于在Grafana里筛选你的应用日志 DEFAULT_LOG_LABELS = {"service": "heroku-js-app", "env": "production"}
- 在你的JS应用根目录下的
Procfile里修改启动命令,把应用日志通过管道传给Python脚本处理:
web: node 你原来的应用启动文件路径 | python push-to-loki.py
- 在应用根目录新建
requirements.txt文件,添加Python脚本依赖:
requests
把上述修改提交后推送到Heroku部署,应用运行产生的所有日志会自动同步到Grafana Cloud Loki。
可选稳定方案(独立日志转发进程,不影响应用运行)
如果你不想修改现有应用的启动配置,可以把Python脚本单独部署为一个Heroku日志接收服务,通过Heroku官方的Log Drain机制同步日志:
- 给修改好的Python脚本添加简单的HTTP接收接口,代码参考:
import os import time import requests from flask import Flask, request app = Flask(__name__) # 替换为你自己的Loki配置 LOKI_PUSH_URL = "你的Loki推送端点" LOKI_USERNAME = "你的Loki实例ID" LOKI_API_KEY = "你的API密钥" DEFAULT_LABELS = {"service": "heroku-js-app"} @app.route('/heroku-log-drain', methods=['POST']) def receive_logs(): raw_logs = request.data.decode('utf-8').splitlines() # 组装Loki要求的推送格式 loki_payload = { "streams": [{ "stream": DEFAULT_LABELS, "values": [[str(int(time.time() * 1000000000)), log] for log in raw_logs] }] } # 推送日志到Loki requests.post( LOKI_PUSH_URL, auth=(LOKI_USERNAME, LOKI_API_KEY), json=loki_payload ) return "success", 200 if __name__ == "__main__": app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
- 把这个Python脚本单独部署为一个Heroku应用,记下它的访问域名
- 在Heroku后台的你的JS应用设置页,添加Log Drain,地址填
https://<你部署的Python应用域名>/heroku-log-drain即可。
排查注意事项
- 如果日志没有同步,先在本地运行Python脚本手动推送一条测试日志,确认Loki配置参数正确
- Heroku免费实例休眠不会影响日志同步,只要JS应用运行时日志都会正常推送
内容的提问来源于stack exchange,提问作者bourdieu
相关产品推荐
相关产品推荐

