golang log包学习笔记

Logger

  打印日志等操作的接收者是 *Logger

type Logger struct {
   mu     sync.Mutex // ensures atomic writes; protects the following fields
   prefix string     // prefix on each line to identify the logger (but see Lmsgprefix)
   flag   int        // properties
   out    io.Writer  // destination for output
   buf    []byte     // for accumulating text to write
}

  所以在打印日志前,需要构造一个Logger对象

  log包自带一个默认的Logger,使用log.Println()等打印日志操作时,实际上是使用了该Logger

var std = New(os.Stderr, "", LstdFlags)
func New(out io.Writer, prefix string, flag int) *Logger {
	return &Logger{out: out, prefix: prefix, flag: flag}
}

  每个Logger有自己的out,所以想将不同等级的log打印到不同地方,需要创建新的Logger使用

var (
   Info    *log.Logger
   Warning *log.Logger
   Error   *log.Logger
)

func init() {
   Info = log.New(ioutil.Discard, "Info:", log.Ldate|log.Ltime|log.Lmicroseconds|log.Llongfile)
   Warning = log.New(os.Stdout, "Warning:", log.Ldate|log.Ltime|log.Lmicroseconds|log.Llongfile)
   Error = log.New(os.Stderr, "Error:", log.Ldate|log.Ltime|log.Lmicroseconds|log.Llongfile)
}

  Logger提供的方法简单而又清晰,主要分为设置和打印两种

设置Logger参数

  在用log.New构造Logger对象时,对应的三个参数分别是日志输出位置、日志前缀、日志信息

  当Logger构造好后,Logger也有对应的方法修改以上三个值

SetOutput
func (l *Logger) SetOutput(w io.Writer) {
   l.mu.Lock()
   defer l.mu.Unlock()
   l.out = w
}

  修改日志信息的输出位置

SetPrefix
func (l *Logger) SetPrefix(prefix string) {
   l.mu.Lock()
   defer l.mu.Unlock()
   l.prefix = prefix
}

  修改日志信息前缀

SetFlags
func (l *Logger) SetFlags(flag int) {
   l.mu.Lock()
   defer l.mu.Unlock()
   l.flag = flag
}

  修改日志输出信息,时间、代码位置等

打印日志
打印日志内容
func (l *Logger) Print(v ...interface{}) { l.Output(2, fmt.Sprint(v...)) }
func (l *Logger) Printf(format string, v ...interface{}) {
	l.Output(2, fmt.Sprintf(format, v...))
}
func (l *Logger) Println(v ...interface{}) { l.Output(2, fmt.Sprintln(v...)) }
打印日志内容后退出程序(严重错误)
func (l *Logger) Fatal(v ...interface{}) {
   l.Output(2, fmt.Sprint(v...))
   os.Exit(1)
}
func (l *Logger) Fatalf(format string, v ...interface{}) {
	l.Output(2, fmt.Sprintf(format, v...))
	os.Exit(1)
}
func (l *Logger) Fatalln(v ...interface{}) {
	l.Output(2, fmt.Sprintln(v...))
	os.Exit(1)
}
打印日志内容后宕机
func (l *Logger) Panic(v ...interface{}) {
   s := fmt.Sprint(v...)
   l.Output(2, s)
   panic(s)
}
func (l *Logger) Panicf(format string, v ...interface{}) {
	s := fmt.Sprintf(format, v...)
	l.Output(2, s)
	panic(s)
}
func (l *Logger) Panicln(v ...interface{}) {
	s := fmt.Sprintln(v...)
	l.Output(2, s)
	panic(s)
}

  可以发现,打印日志最原始的方法是Output

func (l *Logger) Output(calldepth int, s string) error

  Output是暴露出去的方法,所以在程序中也可以直接使用

  calldepth可以恢复PC,打印日志时,如果flag设置了file,可以看到调用栈前面几层的位置

func main() {
   log.SetFlags(log.Llongfile)
   log.Output(0,"calldepth 0")
   log.Output(1,"calldepth 1")
   log.Output(2,"calldepth 2")
   log.Output(3,"calldepth 3")
}
/* 结果
/usr/local/go/src/log/log.go:376: calldepth 0
~/go/src/awesomeProject/main.go:8: calldepth 1
/usr/local/go/src/runtime/proc.go:203: calldepth 2
/usr/local/go/src/runtime/asm_amd64.s:1373: calldepth 3 
*/

  使用Println等方法时,因为调用栈又多了一层,所以calldepth的值都为2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GoLang学习笔记主要括以下几个方面: 1. 语法规则:Go语言要求按照语法规则编写代码,例如变量声明、函数定义、控制结构等。如果程序中违反了语法规则,编译器会报错。 2. 注释:Go语言中的注释有两种形式,分别是行注释和块注释。行注释使用`//`开头,块注释使用`/*`开头,`*/`结尾。注释可以提高代码的可读性。 3. 规范代码的使用:括正确的缩进和空白、注释风格、运算符两边加空格等。同时,Go语言的代码风格推荐使用行注释进行注释整个方法和语句。 4. 常用数据结构:如数组、切片、字符串、映射(map)等。可以使用for range遍历这些数据结构。 5. 循环结构:Go语言支持常见的循环结构,如for循环、while循环等。 6. 函数:Go语言中的函数使用`func`关键字定义,可以有参数和返回值。函数可以提高代码的重用性。 7. 指针:Go语言中的指针是一种特殊的变量,它存储的是另一个变量的内存地址。指针可以实现动态内存分配和引用类型。 8. 并发编程:Go语言提供了goroutine和channel两个并发编程的基本单位,可以方便地实现多线程和高并发程序。 9. 标准库:Go语言提供了丰富的标准库,涵盖了网络编程、文件操作、加密解密等多个领域,可以帮助开发者快速实现各种功能。 10. 错误处理:Go语言中的错误处理使用`defer`和`panic`两个关键字实现,可以有效地处理程序运行过程中出现的错误。 通过以上内容的学习,可以掌握Go语言的基本语法和编程思想,为进一步学习和应用Go语言打下坚实的基础。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Golang学习笔记](https://blog.csdn.net/weixin_52310067/article/details/129467041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [golang学习笔记](https://blog.csdn.net/qq_44336275/article/details/111143767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值