濮阳杆衣贸易有限公司

主頁 > 知識庫 > golang之log rotate詳解

golang之log rotate詳解

熱門標(biāo)簽:惠州電銷防封電話卡 釘釘有地圖標(biāo)注功能嗎 汕頭小型外呼系統(tǒng) 濱州自動電銷機(jī)器人排名 阿里云ai電話機(jī)器人 鄭州亮點科技用的什么外呼系統(tǒng) 浙江高頻外呼系統(tǒng)多少錢一個月 黃岡人工智能電銷機(jī)器人哪個好 建造者2地圖標(biāo)注

操作系統(tǒng): 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接口,但實際開發(fā)中我們需要該功能:

我們不希望單個日志過大,否則文本編輯器無法打開,查看比較困難;

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

解決方案

借助帶緩沖的channel來實現(xiàn)。

示例代碼如下:

/*
  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

討論

這里只是個簡單的示例代碼,實現(xiàn)了log rotate,更多功能需自行開發(fā)。

好,就這些了,希望對你有幫助。

以上這篇golang之log rotate詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 詳解Golang 與python中的字符串反轉(zhuǎn)
  • 深入理解golang的異常處理機(jī)制
  • Golang開發(fā)中常用的代碼片段匯總
  • 在Golang代碼中如何自動生成版本號的方法示例
  • Golang中switch語句和select語句的用法教程
  • Golang讀寫Excel的方法教程
  • 利用Golang如何調(diào)用Linux命令詳解
  • Golang多線程刷票的實現(xiàn)代碼

標(biāo)簽:瀘州 駐馬店 阿壩 東營 晉中 滄州 泰安 昭通

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang之log rotate詳解》,本文關(guān)鍵詞  golang,之,log,rotate,詳解,golang,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang之log rotate詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang之log rotate詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    将乐县| 神池县| 玉屏| 河曲县| 湾仔区| 逊克县| 武威市| 宕昌县| 道孚县| 大余县| 大安市| 遂宁市| 阿鲁科尔沁旗| 奈曼旗| 上饶县| 个旧市| 克什克腾旗| 韶山市| 广南县| 罗平县| 洱源县| 星座| 同仁县| 沐川县| 定边县| 谢通门县| 西城区| 垫江县| 广德县| 高雄县| 天峨县| 汤原县| 台北市| 类乌齐县| 天长市| 房山区| 湘乡市| 云浮市| 乌拉特后旗| 资兴市| 陇西县|