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函数内:

 

posted @ 2023-10-06 15:36  烟熏牛肉干  阅读(56)  评论(0编辑  收藏  举报