我正在编写一个应用程序,需要在两个不同的文件中记录日志。例如 weblogs.go 和 debuglogs.go。我尝试使用 log4go,但我的要求是需要在主文件中创建日志记录器,并在子目录中访问它,因为大部分解码和日志记录工作都是在子文件中完成的。有人可以帮忙吗?
我正在编写一个应用程序,需要在两个不同的文件中记录日志。例如 weblogs.go 和 debuglogs.go。我尝试使用 log4go,但我的要求是需要在主文件中创建日志记录器,并在子目录中访问它,因为大部分解码和日志记录工作都是在子文件中完成的。有人可以帮忙吗?
这是一种使用标准的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
对象可以传递给函数并由它们用于记录事情这是如何使用多个日志文件管理调试和生产环境的方法:
首先,创建一个用于管理多个记录器的类型,你可以创建一个独立的文件,例如 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
}
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")
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")