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文件,进行日志清空
时间: 2024-10-11 09:06:05