婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

golang之log rotate詳解

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

操作系統: 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詳解》,本文關鍵詞  golang,之,log,rotate,詳解,golang,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang之log rotate詳解》相關的同類信息!
  • 本頁收集關于golang之log rotate詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 独山县| 乐安县| 万载县| 蓬安县| 毕节市| 敖汉旗| 元氏县| 南通市| 西乌珠穆沁旗| 济南市| 海淀区| 扎兰屯市| 筠连县| 钟祥市| 辽阳县| 金塔县| 罗田县| 岑溪市| 道真| 额敏县| 大冶市| 类乌齐县| 安岳县| 安吉县| 永仁县| 桓台县| 彭阳县| 林甸县| 正定县| 西充县| 连南| 哈密市| 虹口区| 邯郸市| 登封市| 宁津县| 黄大仙区| 革吉县| 伊通| 梓潼县| 桓台县|