主页 > 知识库 > golang之log rotate详解

golang之log rotate详解

热门标签:服务外包 AI电销 百度竞价排名 铁路电话系统 网站排名优化 Linux服务器 地方门户网站 呼叫中心市场需求

操作系统: CentOS 6.9_x64

go语言版本: 1.8.3

问题描述

golang的log模块提供的有写日志功能,示例代码如下:

/*
golang log example

*/
package main

import (
  "log"
  "os"
)

func main() {
  logFile,err := os.Create("test1.log")
  defer logFile.Close()
  if err != nil {
    log.Fatalln("open file error!")
  }
  logger := log.New(logFile,"[Debug]",log.Ldate | log.Ltime | log.Lshortfile)
  logger.Println("test debug message")
  logger.SetPrefix("[Info]")
  logger.Println("test info message")

}

运行效果:

[root@local t2]# go build logTest1.go
[root@local t2]# ./logTest1
[root@local t2]# cat test1.log
[Debug]2017/06/13 23:18:36 logTest1.go:19: test debug message
[Info]2017/06/13 23:18:36 logTest1.go:21: test info message
[root@local t2]#

go语言的log模块没有提供log rotate接口,但实际开发中我们需要该功能:

我们不希望单个日志过大,否则文本编辑器无法打开,查看比较困难;

更不希望占用太大的存储空间,可以指定最多存多少个日志文件。

解决方案

借助带缓冲的channel来实现。

示例代码如下:

/*
  golang log rotate example

*/

package main

import (
  "fmt"
  "log"
  "os"
  "time"
)

const (
  BACKUP_COUNT = 5
  MAX_FILE_BYTES = 2 * 1024
)

func doRotate(fPrefix string) {
  for j := BACKUP_COUNT; j >= 1; j-- {
    curFileName := fmt.Sprintf("%s_%d.log",fPrefix,j)
    k := j-1
    preFileName := fmt.Sprintf("%s_%d.log",fPrefix,k)

    if k == 0 {
      preFileName = fmt.Sprintf("%s.log", fPrefix)
    }
    _,err := os.Stat(curFileName)
    if err == nil {
      os.Remove(curFileName)
      fmt.Println("remove : ", curFileName)
    }
    _,err = os.Stat(preFileName)
    if err == nil {
      fmt.Println("rename : ", preFileName, " => ", curFileName)
      err = os.Rename(preFileName, curFileName)
      if err != nil {
        fmt.Println(err)
      }
    }
  }
}

func NewLogger(fPrefix string) (*log.Logger, *os.File) {
  var logger *log.Logger
  fileName := fmt.Sprintf("%s.log", fPrefix)
  fmt.Println("fileName :", fileName)
  logFile, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

  if err != nil {
    fmt.Println("open file error!")
  } else {
    logger = log.New(logFile, "[Debug]", log.Ldate|log.Ltime|log.Lshortfile)
  }
  return logger, logFile
}

func logWorker(msgQueue -chan string) {
  fPrefix := "msg"
  logger, logFile := NewLogger(fPrefix)
  for msg := range msgQueue {
    logger.Println(msg)
    fi, err2 := logFile.Stat()
    if err2 == nil {
      if fi.Size() > MAX_FILE_BYTES {
        logFile.Close()
        doRotate(fPrefix)
        logger,logFile = NewLogger(fPrefix)
      }
    }
  }
  logFile.Close()
}

func main() {
  msgQueue := make(chan string, 1000)
  go logWorker(msgQueue)

  for j := 1; j = 1000; j++ {
    msgQueue - fmt.Sprintf("msg_%d", j)
    time.Sleep(1 * time.Second)
  }
  close(msgQueue)
  return
}

运行效果如下:

[root@local t2]# ./logRotateTest1
fileName : msg.log
rename : msg.log => msg_1.log
fileName : msg.log
rename : msg_1.log => msg_2.log
rename : msg.log => msg_1.log
fileName : msg.log
rename : msg_2.log => msg_3.log
rename : msg_1.log => msg_2.log
rename : msg.log => msg_1.log
fileName : msg.log
^C

讨论

这里只是个简单的示例代码,实现了log rotate,更多功能需自行开发。

好,就这些了,希望对你有帮助。

以上这篇golang之log rotate详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • 详解Golang 与python中的字符串反转
  • 深入理解golang的异常处理机制
  • Golang开发中常用的代码片段汇总
  • 在Golang代码中如何自动生成版本号的方法示例
  • Golang中switch语句和select语句的用法教程
  • Golang读写Excel的方法教程
  • 利用Golang如何调用Linux命令详解
  • Golang多线程刷票的实现代码

标签:仙桃 衡水 湘潭 黄山 湖南 铜川 崇左 兰州

巨人网络通讯声明:本文标题《golang之log rotate详解》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266