在Golang中实现一个最小的记录器

时间:2016-10-30 20:31:03

标签: logging go

我在Golang中创建了一个最小的记录器。 我尽量保持简单,但出现了两个问题:

  • 消息字符串显示为括号[]
  • 中包含的数组
  • 使用log.Lshortfile标记的文件名始终显示为logger.go

CMD

这是我的代码:

package logger

import (
    "log"
    "os"
)

var (
    dlog = log.New(os.Stdout, "\x1B[36mDEBUG: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
    wlog = log.New(os.Stdout, "\x1B[35mWARN: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
    ilog = log.New(os.Stdout, "\x1B[32mINFO: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
    elog = log.New(os.Stderr, "\x1B[31mERROR: \x1B[0m", log.Ldate|log.Ltime|log.Lshortfile)
)

// Debug Log
func Debug(a ...interface{}) {
     dlog.Println(a)
}

// Warn log
func Warn(a ...interface{}) {
    wlog.Println(a)
}

// Info Log
func Info(a ...interface{}) {
    ilog.Println(a)
}

// Error Log
func Error(a ...interface{}) {
    elog.Println(a)
}

我像这样使用它们:logger.Debug("Hello") or logger.Info("There")

如何正确实现?谢谢。

1 个答案:

答案 0 :(得分:2)

Println传递一个参数,一个接口{}切片,并使用切片表示法打印它。要解决此问题,请将可变参数传递给函数作为被调用函数的可变参数。

func Debug(a ...interface{}) {
     dlog.Println(a...) // <-- note ... here
}

Here's the doc on variadic args

致电Output以解决文件名问题。

func Debug(a ...interface{}) {
     dlog.Output(2, fmt.Sprintln(a...))
}