go语言自定义一个简单的日志模块
初学者,半路出家,没有老师带,自学中,代码没什么质量可言,将就用吧。
主要用go写一些小的测试工具类,用zap框架太复杂,用log又觉得功能不太够,所以自己写了一个满足自己需求的日志记录模块。
对日志文本文件的记录每日只进行一次打开关闭操作,比起每记录一条打开关闭一次日志文件能明显提升I/O操作效率。
可以在调用函数的参数中指定日志是否输出到控制台或者日志文件。
根据日志等级显示不同的颜色。
目录结构如下:
filename.go
package logging var ( LogFilePath string = `logs` // 存放路径 LogFileExt string = `.log` // 文件扩展名 DebugPrefix string = `debug` // Debug前缀 InfoPrefix string = `info` // Info前缀 WarnPrefix string = `warn` // Warn前缀 ErrorPrefix string = `error` // Error前缀 FatalPrefix string = `fatal` // Fatal前缀 _debugFileName string _infoFileName string _warnFileName string _errorFileName string _fatalFileName string )
level.go
package logging // 级别是日志记录的优先级,级别越高越重要 type Level int8 const ( //指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息 // //日志通常数量庞大,建议在生产中禁用 DebugLevel Level = iota // 消息在粗粒度级别上突出强调应用程序的运行过程。 // // 默认的日志记录优先级 InfoLevel // 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。 // // 比 Info 日志更重要 WarnLevel // 指出虽然发生错误事件,但仍然不影响系统的继续运行。 // // 具有高优先级 ErrorLevel // 指出每个严重的错误事件将会导致应用程序的退出 // // 最高优先级,会调用 os.Exit(1)退出程序 FatalLevel )
logging.go
package logging import ( "fmt" "github.com/fatih/color" "os" "path/filepath" "time" ) var ( _debug *os.File _info *os.File _warn *os.File _error *os.File _fatal *os.File ) var ( _fileDay int // 日志文件的日期 // 当前日期 ) func Open() { // 初始化日志文件日期 _fileDay = time.Now().Day() //// 初始化日志文件路径 //path, _ := os.Getwd() os.MkdirAll(LogFilePath, os.ModePerm) _debugFileName = filepath.Join(LogFilePath, DebugPrefix) + `_` + time.Now().Format("2006-01-02") + LogFileExt _infoFileName = filepath.Join(LogFilePath, InfoPrefix) + `_` + time.Now().Format("2006-01-02") + LogFileExt _warnFileName = filepath.Join(LogFilePath, WarnPrefix) + `_` + time.Now().Format("2006-01-02") + LogFileExt _errorFileName = filepath.Join(LogFilePath, ErrorPrefix) + `_` + time.Now().Format("2006-01-02") + LogFileExt _fatalFileName = filepath.Join(LogFilePath, FatalPrefix) + `_` + time.Now().Format("2006-01-02") + LogFileExt // 初始化日志文件I/O,打开日志文件 _debug, _ = os.OpenFile(_debugFileName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) _info, _ = os.OpenFile(_infoFileName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) _warn, _ = os.OpenFile(_warnFileName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) _error, _ = os.OpenFile(_errorFileName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) _fatal, _ = os.OpenFile(_fatalFileName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) } func Close() { _debug.Close() _info.Close() _warn.Close() _error.Close() _fatal.Close() } // 发送日志 func SendLog(message string, console bool, logFile bool, level Level) { if console { fmt.Println(logFmtToConsole(message, level)) }// 如果需要写入日志文件 if logFile { writeLogFile(message, level) } } func logFmtToConsole(message string, level Level) string { var lv string var c *color.Color switch level { case DebugLevel: c0 := color.New(color.BgCyan) lv = c0.Sprint("[DEBUG]") + "\t" // Cyan c = color.New(color.FgHiCyan) case InfoLevel: c1 := color.New(color.BgGreen) lv = c1.Sprint("[INFO]") + "\t" // Green c = color.New(color.FgHiGreen) case WarnLevel: c2 := color.New(color.BgYellow) lv = c2.Sprint("[WARN]") + "\t" // Yellow c = color.New(color.FgHiYellow) case ErrorLevel: c3 := color.New(color.BgRed) lv = c3.Sprint("[ERROR]") + "\t" // Red c = color.New(color.FgHiRed) case FatalLevel: fallthrough default: c4 := color.New(color.BgRed) lv = c4.Sprint("[FATAL]") + "\t" // Red c = color.New(color.FgHiRed) } tm := color.HiBlueString("[" + time.Now().Format("2006-01-02 15:04:05.000") + "]") return tm + ` ` + lv + c.Sprint(message) } func logFmtToFile(message string, level Level) string { var lv string switch level { case DebugLevel: lv = "[DEBUG]\t" case InfoLevel: lv = "[INFO]\t" case WarnLevel: lv = "[WARN]\t" case ErrorLevel: lv = "[ERROR]\t" case FatalLevel: fallthrough default: lv = "[FATAL]\t" } return "[" + time.Now().Format("2006-01-02 15:04:05.000") + "]" + ` ` + lv + message + "\n" } // 写入日志到文件 func writeLogFile(message string, level Level) { // 判断时间是不是跨天,如果跨天了,则新生成一个日志文件 if _fileDay != time.Now().Day() { // 关闭前一天的日志文件 Close() // 重新初始化新日志文件 Open() } switch level { case DebugLevel: _debug.WriteString(logFmtToFile(message, level)) case InfoLevel: _info.WriteString(logFmtToFile(message, level)) case WarnLevel: _warn.WriteString(logFmtToFile(message, level)) case ErrorLevel: _error.WriteString(logFmtToFile(message, level)) case FatalLevel: fallthrough default: _fatal.WriteString(logFmtToFile(message, level)) } }
引用方法:
main函数内: