golang为Echo框架提供日志记录和指标监控的中间件插件库echo-middleware的使用

Golang为Echo框架提供日志记录和指标监控的中间件插件库echo-middleware的使用

概述

echo-middleware是一个为Echo框架提供多个中间件的Go包。

动机

在多次编写这些中间件后,决定创建一个包含有用中间件的echo包。

安装

要求

echo-middleware需要Go 1.21或更高版本以及Echo Framework v4。

使用方法

使用go get安装:

$ go get github.com/faabiosr/echo-middleware

然后在你的代码中导入这个包:

import "github.com/faabiosr/echo-middleware"

完整示例Demo

下面是一个使用echo-middleware的完整示例,展示了如何添加日志记录和指标监控中间件:

package main

import (
	"github.com/faabiosr/echo-middleware"
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	// 创建Echo实例
	e := echo.New()

	// 添加基础中间件
	e.Use(middleware.Recover())  // 恢复panic
	e.Use(middleware.Secure())   // 安全相关HTTP头

	// 使用echo-middleware提供的日志中间件
	e.Use(echomiddleware.Logger())

	// 使用echo-middleware提供的指标监控中间件
	e.Use(echomiddleware.Prometheus())

	// 示例路由
	e.GET("/", func(c echo.Context) error {
		return c.String(200, "Hello, Echo with Middleware!")
	})

	// 启动服务器
	e.Logger.Fatal(e.Start(":8080"))
}

代码注释

  1. echomiddleware.Logger() - 提供请求日志记录功能,会记录每个请求的详细信息
  2. echomiddleware.Prometheus() - 提供Prometheus格式的指标监控,可以通过/metrics端点访问

开发要求

  • 安装Go
  • 安装GolangCI-Lint

许可证

该项目使用MIT许可证发布。


更多关于golang为Echo框架提供日志记录和指标监控的中间件插件库echo-middleware的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang为Echo框架提供日志记录和指标监控的中间件插件库echo-middleware的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Echo框架日志记录与指标监控中间件:echo-middleware详解

Echo是一个高性能、极简的Go Web框架,而echo-middleware是一个为Echo框架提供常用中间件的集合,包括日志记录和指标监控等功能。

安装

首先安装Echo和echo-middleware:

go get github.com/labstack/echo/v4
go get github.com/labstack/echo/v4/middleware

日志记录中间件

Echo提供了强大的日志中间件,可以记录HTTP请求的详细信息。

基本使用

package main

import (
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	e := echo.New()
	
	// 默认日志中间件
	e.Use(middleware.Logger())
	
	// 自定义日志格式
	e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
		Format: "method=${method}, uri=${uri}, status=${status}\n",
	}))
	
	e.GET("/", func(c echo.Context) error {
		return c.String(200, "Hello, World!")
	})
	
	e.Logger.Fatal(e.Start(":8080"))
}

自定义日志配置

e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
	Format: `${time_rfc3339} ${remote_ip} ${host} ${method} ${uri} ${user_agent} ` +
		`${status} ${error} ${latency_human}` + "\n",
	CustomTimeFormat: "2006-01-02 15:04:05",
	Output: os.Stdout, // 可以指定输出到文件
}))

指标监控中间件

Echo提供了Prometheus指标监控中间件,可以收集HTTP请求的各种指标。

Prometheus监控集成

package main

import (
	"github.com/labstack/echo-contrib/prometheus"
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	e := echo.New()
	
	// 启用Prometheus指标
	p := prometheus.NewPrometheus("echo", nil)
	p.Use(e)
	
	// 其他中间件
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())
	
	// 路由
	e.GET("/", func(c echo.Context) error {
		return c.String(200, "Hello, Metrics!")
	})
	
	// 专门暴露指标的端口
	go func() {
		metrics := echo.New()
		metrics.GET("/metrics", prometheus.HandlerFunc())
		metrics.Logger.Fatal(metrics.Start(":9090"))
	}()
	
	e.Logger.Fatal(e.Start(":8080"))
}

自定义指标

import (
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

func init() {
	// 自定义计数器
	customCounter := prometheus.NewCounter(
		prometheus.CounterOpts{
			Name: "custom_requests_total",
			Help: "Total number of custom requests",
		},
	)
	prometheus.MustRegister(customCounter)
}

// 在handler中使用
e.GET("/custom", func(c echo.Context) error {
	customCounter.Inc()
	return c.String(200, "Custom metric incremented")
})

其他有用的中间件

请求ID

e.Use(middleware.RequestID())

恢复中间件

e.Use(middleware.Recover())

限流中间件

e.Use(middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(20)))

CORS中间件

e.Use(middleware.CORS())

Gzip压缩

e.Use(middleware.Gzip())

完整示例

package main

import (
	"os"
	
	"github.com/labstack/echo-contrib/prometheus"
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	e := echo.New()
	
	// 日志中间件
	e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
		Format: `${time_rfc3339} ${remote_ip} ${method} ${uri} ${status} ${latency_human}` + "\n",
		Output: os.Stdout,
	}))
	
	// Prometheus指标
	p := prometheus.NewPrometheus("echo", nil)
	p.Use(e)
	
	// 其他中间件
	e.Use(middleware.RequestID())
	e.Use(middleware.Recover())
	e.Use(middleware.CORS())
	e.Use(middleware.Gzip())
	
	// 路由
	e.GET("/", func(c echo.Context) error {
		return c.String(200, "Hello, Echo!")
	})
	
	// 指标服务
	go func() {
		metrics := echo.New()
		metrics.GET("/metrics", prometheus.HandlerFunc())
		metrics.Logger.Fatal(metrics.Start(":9090"))
	}()
	
	e.Logger.Fatal(e.Start(":8080"))
}

总结

echo-middleware为Echo框架提供了丰富的中间件支持,特别是日志记录和指标监控功能:

  1. 日志记录:可以自定义格式、输出位置和时间格式
  2. 指标监控:原生支持Prometheus,方便集成到监控系统
  3. 其他功能:请求ID、恢复、限流、CORS等常用功能

通过这些中间件,可以快速为Echo应用添加生产环境所需的关键功能,而无需重复造轮子。

回到顶部