当前位置: 首页 > news >正文

【Go】--log模块的使用

Go log模块使用

对于更复杂的日志需求,可以考虑使用第三方日志库如zaplogrus等,它们提供了更丰富的功能和更好的性能

1.主要特性

  • 线程安全的日志记录
  • 灵活的日志格式配置
  • 支持多种输出目标(控制台、文件等)- 内置错误处理和程序终止功能
  • 支持自定义Logger创建

2. 基础日志输出

2.1 基本日志方法

log包提供了三种基本的日志输出方法:

package mainimport "log"func main() {// Println - 自动添加换行符log.Println("这是一条日志信息")// Printf - 格式化输出str := "this is a test of log"log.Printf("%s", str)// Print - 不添加换行符log.Print("这条信息没有换行")
}

2.2 错误处理日志

log包还提供了在记录日志后终止程序的特殊方法:

package mainimport "log"func main() {// Fatal系列函数会在日志输出后调用os.Exit(1)log.Fatalf("触发fatal错误,程序将退出")// Panic系列函数会在日志输出后调用panic()log.Panicln("触发panic错误")
}

注意:Fatal和Panic方法调用后程序会终止,后续代码不会执行。

3. 日志格式配置

3.1 设置日志标志

使用SetFlags方法可以配置日志的输出格式:

package mainimport "log"func main() {// 设置日志格式标志log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)log.Println("设置完格式后的日志信息")
}

3.2 可用的日志标志

log包定义了以下常量来控制日志格式:

const (Ldate         = 1 << iota     // 日期:2009/01/23Ltime                         // 时间:01:23:23Lmicroseconds                 // 微秒级别的时间:01:23:23.123123Llongfile                     // 文件全路径名+行号:/a/b/c/d.go:23Lshortfile                    // 文件名+行号:d.go:23LUTC                          // 使用UTC时间LstdFlags     = Ldate | Ltime // 标准logger的初始值
)

4. 日志前缀配置

4.1 设置日志前缀

使用SetPrefix方法可以为日志添加前缀:

package mainimport "log"func main() {log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)// 默认无前缀log.Println("没有设置前缀的日志信息")// 设置前缀log.SetPrefix("INFO: ")log.Println("设置完日志前缀的信息")// 获取当前前缀prefix := log.Prefix()log.Printf("当前前缀是:%s", prefix)
}

5. 文件日志输出

5.1 将日志输出到文件

使用SetOutput方法可以将日志重定向到文件:

package mainimport ("log""os""time"
)// 全局文件变量
var logfile *os.Filefunc init() {// 创建日志目录os.Mkdir("log", 0755)// 打开或创建日志文件var err errorlogfile, err = os.OpenFile("log/"+time.Now().Format("2006-01-02")+".log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil {log.Fatalf("打开日志文件失败:%v", err)return}// 配置日志log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)log.SetOutput(logfile)log.SetPrefix("Prefix:")
}func main() {// 确保文件关闭defer logfile.Close()log.Println("这是一条写入文件的日志信息")
}

5.2 文件打开模式说明

  • os.O_CREATE:如果文件不存在则创建
  • os.O_WRONLY:只写模式打开文件
  • os.O_APPEND:追加模式,新内容添加到文件末尾
  • 0666:文件权限设置

6. 自定义Logger

6.1 使用log.New()创建自定义Logger

log.New()函数允许创建具有特定配置的Logger实例:

package mainimport ("log""os""time"
)func main() {// 创建日志目录os.Mkdir("log", 0755)// 打开日志文件logfile, err := os.OpenFile("log/"+time.Now().Format("2006-01-02")+".log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil {log.Fatal(err)return}defer logfile.Close()// 创建自定义Loggerlogger := log.New(logfile, "new:", log.Ldate|log.Ltime|log.Lshortfile)logger.Println("使用New()来创造自己的logger对象")
}

6.2 多个Logger实例

可以创建多个Logger实例用于不同的日志目的:

package mainimport ("log""os"
)func main() {// 创建不同用途的LoggerinfoLogger := log.New(os.Stdout, "INFO: ", log.Ldate|log.Ltime)errorLogger := log.New(os.Stderr, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)infoLogger.Println("这是一条信息日志")errorLogger.Println("这是一条错误日志")
}

7. 高级用法

7.1 日志级别管理

虽然log包本身不提供日志级别,但可以通过自定义实现:

package mainimport ("log""os""io"
)type LogLevel intconst (DEBUG LogLevel = iotaINFOWARNERRORFATAL
)type Logger struct {debug *log.Loggerinfo  *log.Loggerwarn  *log.Loggererror *log.Loggerfatal *log.Loggerlevel LogLevel
}func NewLogger(out io.Writer, level LogLevel) *Logger {flags := log.Ldate | log.Ltime | log.Lshortfilereturn &Logger{debug: log.New(out, "DEBUG: ", flags),info:  log.New(out, "INFO: ", flags),warn:  log.New(out, "WARN: ", flags),error: log.New(out, "ERROR: ", flags),fatal: log.New(out, "FATAL: ", flags),level: level,}
}func (l *Logger) Debug(v ...interface{}) {if l.level <= DEBUG {l.debug.Println(v...)}
}func (l *Logger) Info(v ...interface{}) {if l.level <= INFO {l.info.Println(v...)}
}// 其他级别方法类似...

7.2 并发安全的日志记录

log包的所有方法都是线程安全的,可以在并发环境中安全使用:

package mainimport ("log""sync"
)func main() {var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(id int) {defer wg.Done()log.Printf("协程 %d 正在执行", id)}(i)}wg.Wait()log.Println("所有协程执行完毕")
}

8. 最佳实践

8.1 错误处理

package mainimport ("log""os"
)func setupLogger() (*os.File, error) {file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil {return nil, err}log.SetOutput(file)log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)return file, nil
}func main() {logFile, err := setupLogger()if err != nil {log.Fatal("初始化日志失败:", err)}defer logFile.Close()// 应用程序逻辑...log.Println("应用程序启动成功")
}
http://www.dtcms.com/a/582783.html

相关文章:

  • 交互式参数控制面板:Panel与Bokeh Server深度解析
  • Java基础——递归思想
  • 美术馆网站的建设流程新浪网站制作
  • 中国投诉网站做袜子机器多少钱一台重庆知名网站
  • Rust 练习册 :Luhn From与From trait
  • 服务器网站托管企业文化的重要性
  • NumPy -数组创建
  • 做网站方案怎么写合肥瑶海区寒假兼职工网站建设
  • 学习RT-thread(事件集)
  • 数据结构篇常见面试题清单
  • 基于STM32单片机的正激式开关电源设计(论文+源码)
  • 网站的建议小企业网站建设制作平台
  • Airflow调度爬虫任务:从零搭建高效定时采集系统
  • (论文速读)Fast3R:在一个向前通道中实现1000+图像的3D重建
  • 微算法科技(NASDAQ MLGO)基于PoS的跨链桥接协议(PoS-BCP):重塑区块链互操作生态
  • 网站地图的重要性网站建设开票内容是什么意思
  • 做网站文字编辑累吗室内装饰设计的主要内容
  • 天津网络网站制作巨量引擎广告投放平台登录入口
  • 衡水网站网站建设安全证查询官网
  • 【Linux系统】13. 命令行参数 环境变量
  • 中山免备案网站建设wordpress安装说明seo工具好用
  • 免费个人二级域名网站西安设计工作室
  • SQL plus中解决上下键找历史命令的工具--rlwrap命令行工具
  • 基于微服务脚手架的视频点播系统 (仿B站) [客户端] -1
  • 做网站销售电销好做吗网站建设投标书免费
  • 创建网站要钱吗优惠好券省钱必逛 查看详情 prime会员甄选 查看详情
  • uni-app app移动端实现纵向滑块功能,并伴随自动播放
  • Nacos-服务发现
  • 西安网站建设有限公司上海网站建设的意义
  • 网站推广新手入门h5自己制作模板