golang之log rotate
操作系统: CentOS 6.9_x64
go语言版本: 1.8.3
问题描述
golang的log模块提供的有写日志功能,示例代码如下:
- /*
- golang log example
- E-Mail : Mike_Zhang@live.com
- */
- 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]// :: logTest1.go:: test debug message
- [Info]// :: logTest1.go:: test info message
- [root@local t2]#
go语言的log模块没有提供log rotate接口,但实际开发中我们需要该功能:
我们不希望单个日志过大,否则文本编辑器无法打开,查看比较困难;
更不希望占用太大的存储空间,可以指定最多存多少个日志文件。
解决方案
借助带缓冲的channel来实现。
示例代码如下:
- /*
- golang log rotate example
- E-Mail : Mike_Zhang@live.com
- */
- package main
- import (
- "fmt"
- "log"
- "os"
- "time"
- )
- const (
- BACKUP_COUNT =
- MAX_FILE_BYTES = *
- )
- func doRotate(fPrefix string) {
- for j := BACKUP_COUNT; j >= ; j-- {
- curFileName := fmt.Sprintf("%s_%d.log",fPrefix,j)
- k := j-
- preFileName := fmt.Sprintf("%s_%d.log",fPrefix,k)
- if k == {
- 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, )
- 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, )
- go logWorker(msgQueue)
- for j := ; j <= ; j++ {
- msgQueue <- fmt.Sprintf("msg_%d", j)
- time.Sleep( * 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,更多功能需自行开发。
好,就这些了,希望对你有帮助。
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170614_golang之logRotate.rst
欢迎补充
golang之log rotate的更多相关文章
- Golang官方log包详解
Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...
- linux log rotate
今天老大提醒我产线kafka自身的log文件积累了好几个月了,我才发现原来kafka的log4j并删除old log. 第一反应是采用linux自带的logrotate功能,在/etc/logrota ...
- golang package log
package main import ( "log" "os" ) var logger *log.Logger func main() { file, er ...
- Golang中log与fmt区别
关于使用log与使用fmt的区别 最初的就是直接打印出来,之后一点点升级,比如加上输出的时间,加上goroutine之间的并发操作(打印信息并不能一定按照你规定好的顺序输出来 每次输出的顺序可能会不同 ...
- Golang Learn Log #0
Print/Printf 区别 Print: 可以打印出字符串, 和变量 fmt.Println(var) //right fmt.Println("string") //righ ...
- golang基础学习---log
package main import ( "log" ) func init() { log.SetPrefix("TRACE: ") log.SetFlag ...
- Golang 标准库log的实现
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1406905 前 ...
- Golang 标准库提供的Log(一)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1405754 G ...
- 关于Relay Log无法自己主动删除的问题(Neither --relay-log nor --relay-log-index were used)
今天查看mysql err日志.发现mysql重新启动时总会有例如以下日志出现: [Warning] Neither --relay-log nor --relay-log-index were us ...
随机推荐
- windows快速删除大量文件
del /f/s/q dirname> nulrmdir /s/q dirname
- js混淆加密,通过混淆Js代码让别人(很难)无法还原
js混淆加密,通过混淆Js代码让别人(很难)无法还原 使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密 ...
- HTML5实现简单圆周运动示例
一.使用JS实现圆周运动 根据指定圆心.半径,在定时器中移动固定的弧度,重绘圆圈的位置 源代码: <!DOCTYPE html> <html lang="en"& ...
- 02 如何创建线程 线程并发与synchornized
所有程序运行结果 请自行得出 创建线程方式一:继承Thread类 步骤: 1,定义一个类继承Thread类. 2,覆盖Thread类中的run方法. 3,直接创建Thread的子类对象创建线程. 4, ...
- whl文件(python)安装方法
https://blog.csdn.net/fhl812432059/article/details/51745226 windows7 python2.7 1.用管理员方式打开cmd 2.首先通过p ...
- sys.stdout.flush()以及subprocess的用处
sys.stdout.flush()立即把stdout缓存内容输出. subprocess与shell进行交互,执行shell命令等. 执行shell命令集合: subprocess.check_ou ...
- java实时监听日志写入kafka(转)
原文链接:http://www.sjsjw.com/kf_cloud/article/020376ABA013802.asp 目的 实时监听某目录下的日志文件,如有新文件切换到新文件,并同步写入kaf ...
- String、StringBuffer与StringBuilder之间区别(转)
原文链接:String.StringBuffer与StringBuilder之间区别 最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,Stri ...
- IDEA远程debug的使用
1.打开配置页面 2.添加远程调试配置 3.进行参数配置 不同的jdk版本,配置的参数是不一样的! 其中Host为远程服务器的地址,Port为远程debug的端口,注意要与前面设置的address保持 ...
- QT入门系列(3):控制台输出QString
方式一:使用qDebug()输出 QString str("liyifeng");qDebug() << str;12输出结果:"liyifeng" ...