go标准库之日志组件

在日常开发中,我们可以通过fmt的相关输出函数来调试和分析代码问题,但是在生产环境,这种方式既不优雅也不合理,一般都是通过日志来存放记录,通过日志记录来分析应用。在go标准库中有log和log/syslog来操作日志,而且也有golang/syslog这样的第三方库。

一、日志组件log

1、相关API
  • 设置日志相关格式:New,SetFlags、SetPrefix和SetOutput
  • 获取日志相关设置:Prefix、Flags
  • 输出日志(标准错误输出或文件):Print,Println,Printf,Fatal、Fatalln、Fatalf、Panic、Panicln、Panicf
    (1)SetPrefix
  • 功能:设置日志内容前缀
  • 用法:SetPrefix(prefix string)
  • 参数说明:
    • prefix为前缀内容
  1. log.Println("记录一下")

在未使用前缀前内容如下:

  1. 2017/07/05 10:51:09 记录一下

设置前缀:

  1. log.SetPrefix("[info]")
  2. log.Println("记录一下")

使用后缀后的效果:

  1. [info]2017/07/05 11:01:45 记录一下
(2)SetFlags
  • 功能:设置日志内容格式(除日志内容外的内容,如时间,但需要使用log包自带的常量)
  • 用法:SetFlags(flag int)
  • 参数说明:
    • flag为日志的格式,只能使用以下参数值:
  1. Ldate = 1 << iota // 日期:2009/01/23
  2. Ltime // 时间:01:23:23
  3. Lmicroseconds // 微秒分辨率:01:23:23.123123(用于增强Ltime位)
  4. Llongfile // 文件全路径名+行号: /a/b/c/d.go:23
  5. Lshortfile // 文件无路径名+行号:d.go:23(会覆盖掉Llongfile)

设置日志内容格式:

  1. log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
  2. log.Println("记录一下")

日志内容如下:

  1. [info]2017/07/05 14:25:04 /data/program/goapp/gostd/src/log.go:29: 记录一下
(3)SetOutput
  • 功能:设置日志输出方式(默认是标准错误输出,可以修改为文件)
  • 用法:SetOutput(w io.Writer)
  • 参数说明:
    • w为输出方式,是一人io.Writer的接口(实现Write方法的接口),参考值有os.Stderr,os.Stdout或者一个文件指针

log包默认输出方式为标准错误输出,它只能在终端控制台查看,可以修改为输出到文件中

  1. //以追加的方式来读写文件(并且如果文件不存在,则创建文件)
  2. //os.O_RDWR表示以读写方式打开文件
  3. //os.O_APPEND以追加的方式写入文件
  4. //os.O_CREATE表示如果文件不存在,则创建文件
  5. fd, err := os.OpenFile("./info.log", os.O_RDWR | os.O_APPEND | os.O_CREATE, os.ModePerm)
  6. if err != nil {
  7. log.Fatalf("文件打开失败:%s", err)
  8. }
  9. defer fd.Close()
  10. //改变输出方式(输出到文件中)
  11. log.SetOutput(fd)
  12. log.Println("这是一个日志文件的测试")

那么我们可以在日志文件info.log中可以查看日志的内容

(4)New
  • 功能:创建一个logger指针对象(它相当于SetOutput、SetPrefix和SetFlag三个方法的结合)
  • 用法:New(out io.Reader, prefix String, flag int)
    参数说明:
    • out:日志输出方式
    • prefix:日志内容前缀
    • flag:日志格式
  1. logger := log.New(os.Stderr, "[debug]", log.Ldate | log.Ltime)
  2. logger.Println("通过new来写日志")
(5)Print、Printf和Println

这三个函数与fmt中的三个同名函数功能是类似的

(6)Fatal、Fatalf和Fatalln

这三个函数与Print等三个函数功能是类似的,只不过它多了一个功能就是,它不仅是输出,还会调用os.Exit(1)退出程序

(7)Panic、Panicf和Panicln

这三个功能和Print不同,它会抛出一个Panic

二、日志组件log/syslog

syslog这个库的作用主要是可以向syslog日志服务器发送日志,总体来说,它为远程syslog提供了一组接口,大致分为三个步骤:

1、使用syslog库的三个步骤
(1)使用syslog.Dial方法创建一个与syslog日志服务器的连接对象
(2)使用writer.Alert等记录日志的方法记录日志(包括writer.Info、writer.Crt等)
(3)通过write.Close关闭日志通道
  1. writer, err := syslog.Dial("tcp", "192.168.10.200:1234", syslog.LOG_ALERT | syslog.LOG_ERR | syslog.LOG_CRIT, "app")
  2. if err != nil {
  3. log.Fatalf("发送失败:%s", err)
  4. }
  5. writer.Alert("往远程发送")
  6. writer.Err("错误信息")
  7. writer.Close()
2、使用syslog.NewLogger来创建logger对象,调用log包的方法
  1. //创建一个logger对象
  2. logger, err := syslog.NewLogger(syslog.LOG_ALERT, log.Ldate | log.Ltime | log.Lshortfile)
  3. if err != nil {
  4. log.Fatalf("创建logger失败:%s", err)
  5. }
  6. //要调用logger对象的方法
  7. logger.SetOutput(os.Stderr)
  8. logger.Println("通过syslog的newLogger输出")

注:当然这种实现在实际开发中可能没有必要,毕竟直接调用log包即可