2 回答
TA贡献1775条经验 获得超11个赞
这是使用标准log包的一种方法:
package main
import (
"io"
"log"
"os"
)
func main() {
f1, err := os.Create("/tmp/file1")
if err != nil {
panic(err)
}
defer f1.Close()
f2, err := os.Create("/tmp/file2")
if err != nil {
panic(err)
}
defer f2.Close()
w := io.MultiWriter(os.Stdout, f1, f2)
logger := log.New(w, "logger", log.LstdFlags)
myfunc(logger)
}
func myfunc(logger *log.Logger) {
logger.Print("Hello, log file!!")
}
笔记:
io.MultiWriter
用于将多个编写器组合在一起。在这里,它创建了一个写入器w
- 写入w
将转到os.Stdout
两个文件log.New
让我们log.Logger
用自定义编写器创建一个新对象该
log.Logger
对象可以传递给函数并由它们用来记录事物
TA贡献1780条经验 获得超3个赞
这就是您如何使用多日志文件管理用于调试和生产环境的日志:
首先,创建一个用于管理多个记录器的类型,您可以为此创建一个单独的文件,例如logging.go
type LOGGER struct {
debug *log.Logger
prod *log.Logger
.
.
.
}
要在项目中的任何位置获取指针,最好的方法是通过单例模式LOGGER获取它,例如
var lock = &sync.Mutex{}
var loggers *LOGGER
func GetLoggerInstance() *LOGGER {
lock.Lock()
defer lock.Unlock()
if loggers == nil {
fmt.Println("Creating LOGGER instance now.")
loggers = &LOGGER{}
} else {
fmt.Println("LOGGER instance already created.")
}
return loggers
}
现在在任何 pkg 或目录级别为调试环境设置记录器更好的方法是在根级别设置它
logger := GetLoggerInstance()
f, err := os.OpenFile("path/to/debug/log/file", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("debug log file not created", err.Error())
}
loggers.debug = log.New(f, "[DEBUG]", log.Ldate|log.Ltime|log.Lmicroseconds|log.LUTC)
loggers.debug.Println("This is debug log message")
使用相同的方法,您还可以创建 prod 或任意数量。
logger := GetLoggerInstance()
f, err = os.OpenFile("path/to/prod/log/file", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("prod log file not created", err.Error())
}
loggers.prod = log.New(f, "[PROD]", log.Ldate|log.Ltime|log.Lmicroseconds|log.LUTC)
loggers.prod.Println("This is prod log message")
- 2 回答
- 0 关注
- 258 浏览
添加回答
举报