日志必须分级,包括 Debug、Info、Warn、Error、Fatal; 日志必须有明确的模块和来源标识,方便定位问题; 日志必须包含时间、行号、文件名等信息 请根据上面的规则给出go代码实例
时间: 2023-07-04 08:04:06 浏览: 70
下面是一段使用Go语言标准库log模块实现的日志代码,实现了分级、模块和来源标识、以及包含时间、行号、文件名等信息的要求:
```go
package main
import (
"log"
"os"
)
const (
LOG_LEVEL_DEBUG = iota
LOG_LEVEL_INFO
LOG_LEVEL_WARN
LOG_LEVEL_ERROR
LOG_LEVEL_FATAL
)
var (
LogLevelName = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
)
func main() {
logFile, err := os.Create("app.log")
if err != nil {
log.Fatalln("Failed to create log file:", err)
}
defer logFile.Close()
logger := log.New(logFile, "", log.LstdFlags|log.Lshortfile)
logger.Println("Starting application...")
// Debug level log
logger.Println(logEntry(LOG_LEVEL_DEBUG, "module-A", "source-A", "Debug message"))
// Info level log
logger.Println(logEntry(LOG_LEVEL_INFO, "module-B", "source-B", "Info message"))
// Warn level log
logger.Println(logEntry(LOG_LEVEL_WARN, "module-C", "source-C", "Warn message"))
// Error level log
logger.Println(logEntry(LOG_LEVEL_ERROR, "module-D", "source-D", "Error message"))
// Fatal level log
logger.Fatalln(logEntry(LOG_LEVEL_FATAL, "module-E", "source-E", "Fatal message"))
}
func logEntry(level int, module string, source string, message string) string {
return LogLevelName[level] + " [" + module + ":" + source + "] " + message
}
```
在上面的代码中,我们定义了五个日志级别常量,以及一个日志级别名称的映射数组。然后,我们使用log模块的New函数创建一个新的logger对象,指定日志输出到app.log文件中,同时指定输出格式包括时间、行号、文件名等信息。接着,我们分别使用logger对象输出了Debug、Info、Warn、Error、Fatal级别的日志。为了满足要求中的规则,我们定义了一个logEntry函数,该函数接收日志级别、模块、来源和消息参数,并返回一个符合规则的字符串。最后,我们通过调用logger的Fatalln函数输出了一个Fatal级别的日志,并结束了程序的运行。