文件日志和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,使用起来就很方便了。运行一个,可以正常的使用。