# Golang 自己实现简易版日志库

By [Robin](https://paragraph.com/@robin-8) · 2023-02-27

---

    package mylog
    
    import (
        "fmt"
        "strings"
        "time"
    )
    
    type LogLevel uint16
    
    const (
        DEBUG LogLevel = iota
        INFO
        WARNING
        ERROR
        FATAl
    )
    
    func parseLogLevel(s string) LogLevel {
        s = strings.ToUpper(s)
        switch s {
        case "DEBUG":
            return DEBUG
        case "INFO":
            return INFO
        case "WARNING":
            return WARNING
        case "ERROR":
            return ERROR
        case "FATAL":
            return FATAl
        default:
            return DEBUG
    
        }
    }
    
    // Logger 结构体
    type Logger struct {
        logLevel LogLevel
    }
    
    // Newlogger 构建函数
    func Newlogger(levelStr string) Logger {
        level := parseLogLevel(levelStr)
        return Logger{
            logLevel: level,
        }
    }
    
    func log(level string, format string, arg ...interface{}) {
        msg := fmt.Sprintf(format, arg...)
        now := time.Now()
        fmt.Printf("[%s] [%v]\t%s\n", now.Format("2006-01-02 15:04:05"), level, msg)
    
    }
    
    // 日志级别判断；
    func (l Logger) enable(level LogLevel) bool {
        return level >= l.logLevel
    }
    
    func (l Logger) Debug(format string, arg ...interface{}) {
        if l.enable(DEBUG) {
            log("DEBUG", format, arg...)
        }
    
    }
    
    func (l Logger) Info(format string, arg ...interface{}) {
        if l.enable(INFO) {
            log("INFO", format, arg...)
        }
    }
    
    func (l Logger) Warning(format string, arg ...interface{}) {
        if l.enable(WARNING) {
            log("WARNING", format, arg...)
        }
    }
    
    func (l Logger) Error(format string, arg ...interface{}) {
        if l.enable(ERROR) {
            log("ERROR", format, arg...)
        }
    }
    
    func (l Logger) Fatal(format string, arg ...interface{}) {
        if l.enable(FATAl) {
            log("FATAl", format, arg...)
        }
    }
    

    package main
    
    import (
        "daily-job/day27/mylog"
        "time"
    )
    
    func main() {
        log := mylog.Newlogger("WARNING")
        for {
            log.Debug("This is a debug log.")
            log.Info("This is a Info log.")
            log.Warning("This is a Warning log.")
            log.Error("This is a Error log.")
            log.Fatal("This is a Fatal log.")
            time.Sleep(time.Second)
        }
    
    }

---

*Originally published on [Robin](https://paragraph.com/@robin-8/golang-4)*
