标签:
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文件,进行日志清空
标签:
原文地址:http://my.oschina.net/yang1992/blog/491866