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)
}

结果

最后更新于

这有帮助吗?