码迷,mamicode.com
首页 > 其他好文 > 详细

docker的日志轮转rotate具体实现

时间:2015-08-13 16:04:15      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:

type JSONFileLogger struct {
	buf      *bytes.Buffer //buffer内容
	f        *os.File   // 文件属性
	mu       sync.Mutex // buffer写文件的锁
	capacity int64      //文件容量
	n        int        //日志备份的最大数
	ctx      logger.Context
}

写日志的时候,是通过协程锁约定,防止写入冲突

func (l *JSONFileLogger) Log(msg *logger.Message) error {
	l.mu.Lock()
	defer l.mu.Unlock()

	timestamp, err := timeutils.FastMarshalJSON(msg.Timestamp)
	if err != nil {
		return err
	}
	err = (&jsonlog.JSONLogBytes{Log: append(msg.Line, ‘\n‘), Stream: msg.Source, Created: timestamp}).MarshalJSONBuf(l.buf)
	if err != nil {
		return err
	}
	l.buf.WriteByte(‘\n‘)
	_, err = writeLog(l)
	return err
}

写日志超过超过capacity,会进行日志轮转

func rotate(name string, n int) error {
	if n < 2 {
		return nil
	}
	for i := n - 1; i > 1; i-- {
		oldFile := name + "." + strconv.Itoa(i)
		replacingFile := name + "." + strconv.Itoa(i-1)
		if err := backup(oldFile, replacingFile); err != nil {
			return err
		}
	}
	if err := backup(name+".1", name); err != nil {
		return err
	}
	return nil
}

func backup(old, curr string) error {
	if _, err := os.Stat(old); !os.IsNotExist(err) {
		err := os.Remove(old)
		if err != nil {
			return err
		}
	}
	if _, err := os.Stat(curr); os.IsNotExist(err) {
		if f, err := os.Create(curr); err != nil {
			return err
		} else {
			f.Close()
		}
	}
	return os.Rename(curr, old)
}

通过修改文件名实现日志备份

-----------------------------------------------------------------------------

我自己的测试程序:

package main

import (
	"fmt"
	"math"
	"os"
	"strconv"
	_ "syscall"
	"time"
)

func main() {
	rotate("./yang.txt", 5)
}

func rotate(name string, n int) error {
	if n < 2 {
		return nil
	}
	for i := n - 1; i > 1; i-- {
		oldFile := name + "." + strconv.Itoa(i)
		replacingFile := name + "." + strconv.Itoa(i-1)
		fmt.Println(i)
		fmt.Println("oldfile name:" + oldFile)
		fmt.Println("replacingFile name:" + replacingFile)
		if err := backup(oldFile, replacingFile); err != nil {
			return err
		}
	}
	fmt.Println("hello")
	if err := backup(name+".1", name); err != nil {
		return err
	}
	return nil
}

func backup(old, curr string) error {
	if _, err := os.Stat(old); !os.IsNotExist(err) {
		fmt.Println("remove old:" + old)
		err := os.Remove(old)
		if err != nil {
			return err
		}
	}
	if _, err := os.Stat(curr); os.IsNotExist(err) {
		fmt.Println("create curee:" + curr)
		if f, err := os.Create(curr); err != nil {
			return err
		} else {
			f.Close()
		}
	}
	fmt.Printf("change %s to %s \n", curr, old)
	return os.Rename(curr, old)
}

执行结果

yang.txt内容转移到->yang.txt.1 yang.txt1内容转移到yang.txt.2 yang.txt.2内容转移到yang.txt.3 yang.txt.3内容转移到yang.txt.4

docker日志轮转的xxx-json.log文件相当于yang.txt文件

然后重新创建yang.txt文件,相当于清空yang.txt文件,进行日志清空



docker的日志轮转rotate具体实现

标签:

原文地址:http://my.oschina.net/yang1992/blog/491866

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!