[go-每日一库] 使用log标准库实现日志功能
golang的log标准库对于一些简单的日志功能,可以很方便给我们输出相应日志。
本文主要基于日常的简单使用做分享。
1.实现简单的日志记录
见代码:
package main import ( "log" "os" ) func main() { file, err := os.OpenFile("D:\\demo1\\src\\demo\\demo06\\log-simplest\\simple.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { log.Println("create log file err:", err) } // set flags log.SetFlags(log.LstdFlags|log.Lshortfile) // set prefix log.SetPrefix("[DEBUG] ") // set output log.SetOutput(file) // 输出到文件设置,如果要输出在控制台,则另外设置多重输出 log.Println("debug log test") }
2.设置多重输出-控制台 && log文件
见代码:
package main import ( "fmt" "io" "log" "os" ) func main() { file, err := os.OpenFile("D:\\demo1\\src\\demo\\demo06\\log-multiOutput\\set.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { log.Fatal(err) } // 1.set log output //log.SetOutput(file) // 注意同时设置只有一个生效,想要多重输出,建议选择法2或法3 //log.SetOutput(os.Stdout) // 2.multi output //multiWriter := io.MultiWriter(file, os.Stdout) //log.SetOutput(multiWriter) //log.Print("log line1") // 法1/2 共用测试 //log.Print("log line2") // 3.log.New() debugLogger := log.New(io.MultiWriter(os.Stdout, file), "[DEBUG]", log.LstdFlags | log.Lshortfile) debugLogger.Println("debug logger output with multiOutput") file.Close() fmt.Println("program end") }
3.简单封装实现不同prefix
此封装实现了不同的日志级别,当然更多的级别设置,可以参照实现。
见代码:
// https://juejin.cn/post/6987204299533058078 package logger import ( "io" "log" "os" ) // flags and prefix const ( flag = log.Ldate | log.Ltime | log.Lshortfile preDebug = "[DEBUG] " preInfo = "[INFO] " preWarning = "[WARNING] " preError = "[ERROR] " ) // diff logger and output log file var ( logFile io.Writer debugLogger *log.Logger infoLogger *log.Logger warningLogger *log.Logger errorLogger *log.Logger defaultLogFile = "D:\\demo1\\src\\demo\\demo06\\log-demo\\logs\\web.log" ) // init for logger func init() { var err error logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { defaultLogFile = "./web.log" logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { log.Fatalf("create log file err %+v", err) } } debugLogger = log.New(io.MultiWriter(os.Stdout, logFile), preDebug, flag) infoLogger = log.New(logFile, preInfo, flag) warningLogger = log.New(logFile, preWarning, flag) errorLogger = log.New(logFile, preError, flag) } // Debug logger func Debugf(format string, v...interface{}) { debugLogger.Printf(format, v...) } func Infof(format string, v ...interface{}) { infoLogger.Printf(format, v...) } func Warningf(format string, v ...interface{}) { warningLogger.Printf(format, v...) } func Errorf(format string, v ...interface{}) { errorLogger.Printf(format, v...) } // set output file func setOutputPath(path string) { var err error logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { log.Fatalf("create log file err %+v", err) } debugLogger = log.New(logFile, preDebug, flag) infoLogger = log.New(logFile, preInfo, flag) warningLogger = log.New(logFile, preWarning, flag) errorLogger = log.New(logFile, preError, flag) }
main.go
package main import ( "log-demo/logger" ) func main() { author := "log-demo" logger.Debugf("hello %s", author) logger.Infof("hello %s", author) logger.Warningf("hello %s", author) logger.Errorf("hello %s", author) }
4.使用lumberjack切分日志
lumberjack扩展库见链接:go语言的日志滚动(rolling)记录器——lumberjack
见代码:
package main import ( ""gopkg.in/natefinch/lumberjack.v2"" "log" ) func main() { lumberLogger := lumberjack.Logger{ Filename: "D:\\demo1\\src\\demo\\demo06\\log-lumberjack\\log.log", MaxAge: 1, MaxBackups: 7, Compress: false, LocalTime: true, } logger := log.New(&lumberLogger, "[DEBUG] ", log.LstdFlags|log.Lshortfile) logger.Println("lumberjack to rotate log file") }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探