再系列文章一的基础上 增加 loggings.go
文件
/*
@Time : 2020/6/22 14:04
@Author : zhb
@File : loggings
@Software: GoLand
*/
package main
import (
"github.com/go-kit/kit/log"
"time"
)
type loggingMiddleware struct {
Server
logger log.Logger
}
//日志功能的中间件结构体
func LoggingMiddleware(logger log.Logger) ServerMiddleware {
return func(next Server) Server {
return loggingMiddleware{
next, logger}
}
}
//重新实现add方法
func (mw loggingMiddleware) Add(a, b int) (ret int) {
defer func(beign time.Time) {
mw.logger.Log(
"function", "Add",
"a", a,
"b", b,
"result", ret,
"took", time.Since(beign),
)
}(time.Now())
ret = mw.Server.Add(a, b)
return ret
}
func (mw loggingMiddleware) Sub(a, b int) (ret int) {
defer func(beign time.Time) {
mw.logger.Log(
"function", "Sub",
"a", a,
"b", b,
"result", ret,
"took", time.Since(beign),
)
}(time.Now())
ret = mw.Server.Sub(a, b)
return ret
}
func (mw loggingMiddleware) Mul(a, b int) (ret int) {
defer func(beign time.Time) {
mw.logger.Log(
"function", "Mul",
"a", a,
"b", b,
"result", ret,
"took", time.Since(beign),
)
}(time.Now())
ret = mw.Server.Mul(a, b)
return ret
}
func (mw loggingMiddleware) Div(a, b int) (ret int, err error) {
defer func(beign time.Time) {
mw.logger.Log(
"function", "Div",
"a", a,
"b", b,
"result", ret,
"took", time.Since(beign),
)
}(time.Now())
ret, _ = mw.Server.Div(a, b)
return ret, nil
}
重写main.go文件
/*
@Time : 2020/6/20 11:27
@Author : zhb
@File : main
@Software: GoLand
*/
package main
import (
"context"
"fmt"
"github.com/go-kit/kit/log"
"net/http"
"os"
"os/signal"
"syscall"
)
func main() {
ctx := context.Background()
errChan := make(chan error)
var svc Server
svc = ArithmeticService{
}
var logger log.Logger
{
logger = log.NewLogfmtLogger(os.Stderr)
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
logger = log.With(logger, "caller", log.DefaultCaller)
}
// 增加logger的中间件
svc = LoggingMiddleware(logger)(svc)
endpoint := MakeArithmeticEndpoint(svc)
r := MakeHttpHandler(ctx, endpoint, logger)
go func() {
fmt.Println("Http Server start at port:9000")
errChan <- http.ListenAndServe(":9000", r)
}()
go func() {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
errChan <- fmt.Errorf("%s", <-c)
}()
fmt.Println(<-errChan)
}
运行结果