grafana 不能直接画日志趋势,需先结构化日志、提取指标(如错误数、吞吐量、p95耗时)、再可视化;推荐用 loki+promtail 实现,promtail 打标签并解析 json 日志,loki 通过 logql 统计趋势,grafana 关联 prometheus 指标联动分析。

容器日志本身是文本流,Grafana 不能直接“画出日志趋势”,但可以通过将日志转化为可量化的指标(比如错误数、日志条数、响应耗时分布等),再用 Grafana 的图表展示这些指标的变化趋势。核心在于:先结构化日志 → 再提取指标 → 最后可视化。
用 Loki + Promtail 实现日志趋势可视化
Loki 不存储原始日志全文,而是按标签索引日志流,并支持 LogQL 查询语言统计日志行为。Promtail 负责采集 Docker 日志并打上合理标签(如 container、namespace、level),这是后续趋势分析的基础。
- 确保 Promtail 配置中启用
docker_sd_configs并正确 relabel 容器名、服务名等静态标签 - 推荐在日志输出端使用 JSON 格式(如 Spring Boot 的
logging.pattern.console配合logback-spring.xml输出结构化字段),便于 Promtail 用pipeline_stages提取level、service、duration_ms等字段 - Loki 默认不解析日志内容,所以关键字段必须提前提取为标签或通过 LogQL 在查询时解析(后者性能较差)
在 Grafana 中配置日志趋势图表
Grafana 支持多种面板类型展示日志衍生趋势,常用组合如下:
-
错误率随时间变化(折线图):用 LogQL 统计每分钟 ERROR 数量
sum(rate({job="docker", level="error"}[1m])) by (container) -
日志吞吐量趋势(时间序列图):
sum(rate({job="docker"}[1m])) by (container)—— 可发现突发流量或静默异常 -
响应耗时 P95 分布(带状图或热力图):
histogram_quantile(0.95, sum(rate({job="docker", service="api"} | json | duration_ms != "" | unwrap duration_ms [1m])) by (le)) -
日志级别分布(饼图/柱状图):
sum(count_over_time({job="docker"} | logfmt | level=~"error|warn|info"[1h])) by (level)
关联指标与日志做上下文分析
真正实用的趋势看板,不是孤立看日志,而是和 Prometheus 指标联动:
- 在同一个 Grafana 面板里,左侧放容器 CPU 使用率曲线,右侧放对应容器的 ERROR 日志速率曲线
- 点击某段异常时间段,自动跳转到该时段的原始日志(Logs panel),并高亮匹配
|~ "timeout|oom"的行 - 利用变量实现动态筛选:下拉选择
container后,所有图表自动刷新为该容器的指标+日志趋势
避免常见误区
不是所有“趋势”都适合用日志计算。例如全文关键词频次(如 “Connection refused” 出现次数)虽可用 |~ "refused" | count_over_time([1m]),但性能开销大,建议:
- 高频关键词(ERROR/WARN)优先提取为
level标签,走标签匹配路径 - 低频业务关键词(如订单号、用户ID)不要作为标签,应保留在日志行内,用
|~或|="xxx"检索,不用于趋势统计 - 时间范围务必明确,如
[5m]、[1h],避免无范围查询拖慢整个面板











