ELK远程日志库
[TOC]
在本地打印日志并且上报到elk
项目地址:log
示例
代码
package main
import (
	"context"
	"fmt"
	"github.com/1005281342/log"
)
func main() {
	var ctx = context.Background()
	ctx = log.SetTraceID(ctx, "jesontest20210124-2")
	var logger, err = log.WithContext(ctx,
		log.WithAddress("127.0.0.1:5000"),
		log.WithAppName("jeson"),
		log.WithFuncName("test"),
	)
	if err != nil {
		fmt.Printf("new logger failed: %+v \n", err)
		return
	}
	logger.Error("test Error")
	logger.Errorf("test Error%s", "f")
	logger.Errorv("test Errorv")
	logger.Info("test Info")
	logger.Infof("test Info%s", "f")
	logger.Infov("test Infov")
	logger.Slow("test Slow")
	logger.Slowf("test Slow%s", "f")
	logger.Slowv("test Slowv")
}结果

ELK环境搭建
基于docker
docker部署相关文件地址 https://github.com/deviantony/docker-elk
注意修改docker-compose.yml的ELASTIC_PASSWORD属性
# docker-compose.yml
environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      ELASTIC_PASSWORD: changeme  # 修改密码部署之后可能遇到许可证过期问题,可以参考https://blog.csdn.net/qq_41049126/article/details/108489901解决:
在kibana执行:POST /_license/start_basic?acknowledge=true 或者 curl -XPOST "http://elasticsearch:9200/_license/start_basic?acknowledge=true"
用到go-zero中
代码地址:github.com/1005281342/gozerorpcdemo
服务端代码
// 主要逻辑代码
// 关注创建日志部分即可
package logic
import (
	"context"
	"time"
	"github.com/1005281342/gozerorpcdemo/gozerorpcdemo"
	"github.com/1005281342/gozerorpcdemo/internal/svc"
	"github.com/1005281342/log"
	"github.com/tal-tech/go-zero/core/logx"
)
type PingLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
}
type ELKLogger struct {
	log.Logger
}
func (e *ELKLogger) WithDuration(d time.Duration) logx.Logger {
	e.Logger.WithDuration(d)
	return e
}
func NewPingLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PingLogic {
	return &PingLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		//Logger: logx.WithContext(ctx),
	}
}
func (l *PingLogic) Ping(in *gozerorpcdemo.Request) (*gozerorpcdemo.Response, error) {
	log.SetTraceID(l.ctx, "jesontest go-zero demo")
	var (
		logger         logx.Logger
		loggerELK, err = log.WithContext(l.ctx,
			log.WithAddress("127.0.0.1:5000"),
			log.WithAppName("gozerorpcdemo"),
			log.WithFuncName("Ping"),
		)
	)
	if err != nil {
		logger = logx.WithContext(l.ctx)
		logger.Errorf("err: %+v", err)
	} else {
		logger = &ELKLogger{Logger: loggerELK}
	}
	var out = &gozerorpcdemo.Response{Pong: "OK. " + in.Ping}
	logger.Infof("out: %+v", out)
	return out, nil
}客户端代码
package main
import (
	"context"
	"github.com/1005281342/gozerorpcdemo/gozerorpcdemo"
	"github.com/1005281342/gozerorpcdemo/gozerorpcdemoclient"
	"github.com/tal-tech/go-zero/zrpc"
	"log"
)
func main() {
	var zcli, _ = zrpc.NewClientWithTarget("127.0.0.1:8080")
	var cli = gozerorpcdemoclient.NewGozerorpcdemo(zcli)
	var rsp, err = cli.Ping(context.Background(), &gozerorpcdemo.Request{Ping: "Ping"})
	if err != nil {
		log.Fatalf("ping failed: %s", err.Error())
	}
	log.Printf("rsp %+v \n", rsp)
}结果

最后更新于
这有帮助吗?