一、main函数入口加载logrus
//导包
logrustash "github.com/bshuster-repo/logrus-logstash-hook"
func init() {
//加载 logstash
//log := logrus.New()
middleware.Logus.SetLevel(logrus.InfoLevel)
//设置时间格式
middleware.Logus.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05.000",
})
//配置文件读取相关的配置参数 conf.Logstash.Net;conf.Logstash.Host
conn, err := net.Dial(conf.Logstash.Net, conf.Logstash.Host)
if err != nil {
log.Fatal(err)
}
//serviceId 名称表示 输入到es中,对应的索引名称
hook := logrustash.New(conn, logrustash.DefaultFormatter(logrus.Fields{
"type": "logrus",
"serviceId": config.Instance.Logstash.ServiceId,
}))
middleware.Logus.Hooks.Add(hook)
middleware.Logus.WithFields(logrus.Fields{
"method": "logstash-connect",
}).Infof("connect to " + conf.Logstash.Host + " for logstash is ok")
}
二、自定义日志中间件-LoggerMiddleware
package middleware
import (
"bytes"
"github.com/kataras/iris/v12"
"github.com/sirupsen/logrus"
"io/ioutil"
"net/http"
"strings"
"time"
)
/**
LoggerMiddleware 日志中间件
*/
var Logus = logrus.New()
var Str string
func LoggerMiddleware(ctx iris.Context) {
// 开始时间
startTime := time.Now()
method := ctx.Request().Method
path := ctx.Request().URL.String()
// 如果是POST/PUT请求,并且内容类型为JSON,则读取内容体
if method == http.MethodPost || method == http.MethodPut || method == http.MethodPatch {
}
ctx.Record()
params := ""
body, err := ioutil.ReadAll(ctx.Request().Body)
if err == nil {
defer ctx.Request().Body.Close()
buf := bytes.NewBuffer(body)
ctx.Request().Body = ioutil.NopCloser(buf)
params = string(body)
if strings.Contains(params, "\r\n") {
params = strings.ReplaceAll(params, "\r\n", "")
}
if strings.Contains(params, "\n") {
params = strings.ReplaceAll(params, "\n", "")
}
params = strings.ReplaceAll(params, " ", "")
}
ctx.Next()
// 结束时间
endTime := time.Now()
// 响应时间
responseTime := endTime.Sub(startTime).Milliseconds()
// 下面是返回日志
//返回参数
resStr := ""
resStr = string(ctx.Recorder().Body())
Logus.WithFields(logrus.Fields{
"resquestUrl": path,
"requestParam": params,
"responseResult": resStr,
"responseTime": responseTime,
}).Info(Str)
}
三、config配置文件
// 具体结合自己的配置文件读取方式,获取Logstash 的端口以及host 至于索引名称可以结合项目业务自定义名称
Logstash struct {
Net string `yaml:"Net"`
Host string `yaml:"Host"`
ServiceId string `yaml:"ServiceId"`
} `yaml:"Logstash"`
四、kibana查看日志