go开发属于自己的日志库-日志库易用性封装

文件日志和console日志也完成了,我们试试在其他其他使用一下。在我们之前的server中,main.go输入一下代码:

package main

import "hm_log"

var log hm_log.Log

func initLog(logPath, logName string) {
    //log := hm_log.NewFileLog(logPath, logName)
    log := hm_log.NewConsoleLog()
    log.Debug("this is debug")
}

func Run() {
    log.Warn("this is warn")
}

func main() {
    initLog(".", "server")
    Run()
}

复制代码

运行这个程序,可以看到终端成功的输入了日志,然后试试文件日志库。 但是这样有一个麻烦就是,每个相关都需要声明一个log,还是麻烦,所以我们需要进行提炼,将log 全局变量封装到我们的日志库中,只给一个初始函数,使用的时候直接log变量即可。进入我们的hm_log项目中,新建一个log.go

package hm_log

import "fmt"

var log Log

func InitLog(name string, config map[string]string) (err error) {
	switch name {
	case "file":
		log, err = NewFileLog(config)
	case "console":
		log, err = NewConsoleLog()
	default:
		err = fmt.Errorf("unspport log name:%s", name)
	}
	return
}

func Debug(format string, args ...interface{}) {
	log.Debug(format, args...)
}

func Trace(format string, args ...interface{}) {
	log.Trace(format, args...)
}

func Info(format string, args ...interface{}) {
	log.Info(format, args...)
}

func Warn(format string, args ...interface{}) {
	log.Warn(format, args...)
}

func Error(format string, args ...interface{}) {
	log.Error(format, args...)
}

func Fatal(format string, args ...interface{}) {
	log.Fatal(format, args...)
}

func Close() {
	log.Close()
}
复制代码

由于文件日志需要配置多个参数,这是我们直接使用map来进行传参即可。因为传的是map,所以我们的文件日志库file.go也需要进行修改:

func NewFileLog(config map[string]string) (logFile Log, err error) {
   //判断是否传入了值,没有值就抛出错误
	logPath, ok := config["log_path"]
	if !ok {
		err = fmt.Errorf("not found log_path")
		return
	}
	logName, ok := config["log_name"]
	if !ok {
		err = fmt.Errorf("not found log_name")
		return
	}

	logFile = &FileLog{
		logPath:       logPath,
		logName:       logName,
	}

	//logFile.init()
	logFile.Init()
	return
}
复制代码

logFile.init()这里是会报错的,因为FileLog没有这个方法,所以文们需要加上一个init()方法。进入log_interface.go:

package hm_log

type Log interface {
	Debug(format string, args ...interface{}) // ...表示接收可变参数
	Trace(format string, args ...interface{})
	Info(format string, args ...interface{})
	Warn(format string, args ...interface{})
	Error(format string, args ...interface{})
	Fatal(format string, args ...interface{})
	Close() // 文件需要进行关闭操作
	Init()
}
复制代码

把我们之前的file.go,console.go给加上Init(): file.go

// 替换之前的init()
func (f *FileLog) Init() {
}
复制代码

console.go

func (f *FileLog) Init() { }
复制代码

我们再来修改之前的main.go:

package main

import "hm_log"

func initLog(logPath, logName string) {
   //log := hm_log.NewFileLog(logPath, logName)
	config := make(map[string]string, 8)
	config["log_path"] = "."
	config["log_name"] = "server"
    
   err := InitLog("file", config)
	 if err != nil {
		 return
	 }
}

func Run() {
    log.Warn("this is warn")
}

func main() {
    initLog(".", "server")
    Run()
}
复制代码

这样我们就不需要声明全局变量log,使用起来就很方便了。运行一个,可以正常的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值