docker的日志轮转rotate具体实现

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

docker的日志轮转rotate具体实现的相关文章

09、日志轮转+rsync同步

-- logrotate   -  rotates,  compresses,  and mails system logs 日志轮转 rotate 日志切割 轮转   切割   备份   归档 常见的默认已经定义轮转的日志有: /var/log/messages /var/log/cron /var/log/boot.log /var/log/maillog /var/log/secure vim /etc/logrotate.conf --配置文件 # see "man logrotate&

logrotate的日志轮转linux

案例:logrotate的日志轮转 针对admin.log文件,设置logrotate 每天轮转一次 保留3个备份 文件大于100k自动轮转 论转完的文件压缩创建权限0600,所有者root 所属组root 步骤: 1.首先查看logrotate包是否安装 [[email protected] log]# rpm -q logrotate logrotate-3.7.8-17.el6.x86_64 创建日志admin.log 因为本人虚拟机中没有admin.log这个文件 [[email pro

Linux下logrotate日志轮转操作梳理

对于Linux系统安全来说,日志文件是极其重要的工具.logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用.可以节省磁盘空间.下面就对logrotate日志轮转操作做一梳理记录: 1)配置文件介绍Linux系统默认安装logrotate工具,它默认的配置文件在:/etc/logrotate.conf/etc/logrotate.d/ logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目

日志轮转

日志的轮替.日志的轮转为什么要轮转?1)防止日志文件过大2)定期清除日志 日志轮转的配置文件 vim /etc/logrotate.conf # grep -v ^# /etc/logrotate.conf | grep -v ^$ weekly //轮转的周期,一周一轮转 rotate 4 //保留几个旧的日志文件,类似于备份 create //旧日志轮转后是否创建新的空白日志 dateext //使用日期作为旧日志的后缀 include /etc/logrotate.d //包含该路径下的所

日志系统之基于flume收集docker容器日志

最近我在日志收集的功能中加入了对docker容器日志的支持.这篇文章简单谈谈策略选择和处理方式. 关于docker的容器日志 docker 我就不多说了,这两年火得发烫.最近我也正在把日志系统的一些组件往docker里部署.很显然,组件跑在容器里之后很多东西都会受到容器的制约,比如日志文件就是其中之一. 当一个组件部署到docker中时,你可以通过如下命令在标准输出流(命令行)中查看这个组件的日志: docker logs ${containerName} 日志形如: 但这种方式并不能让你实时获

MongoDB日志轮转

在配置文件中添加参数 logpath=/data/app_data/mongodb/log/mongodb.log  logappend=true Windows下只有这种日志轮转方式 > use admin; switched to db admin > db.runCommand({logRotate : 1}) { "ok" : 1 } Linux下还可以通过设置定时任务每天凌晨轮转日志 0 0 * * * /bin/kill -SIGUSR1 `cat /data/

docker的日志清理

如何清理Docker容器日志? 如何找出docker容器日志文件 容器日志一般存放在/var/lib/docker下面,可使用如下命令查看各个日志的文件大小 ls -lh $(find /var/lib/docker/containers/ -name *-json.log) 如何清理日志 如果docker容器正在运行,那么使用rm -rf 方式删除日志后,通过df -h会发现磁盘空间并没有释放 原因:在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链

Apache自带的rotatelogs实现日志轮转

用Apache自带的rotatelogs程序处理apache生成的日志自动截断重新生成,rotatelogs是一个配合Apache管道日志功能使用的简单程序.设置方法如下: 编辑Apache的主配置文件,更改内容如下: 注释掉如下两行 ErrorLog logs/error_log CustomLog logs/access_log common 然后添加如下两行 ErrorLog "|/path/to/bin/rotatelogs logs/errorlog.%Y-%m-%d-%H_%M_%S

Linux 日志轮转

日志轮转的效果就是把原先的日志记录在本地改成记录在远程设备上实现条件:两台Linux主机,一个是(本地主机)产生日志,另一个(远处主机)负责在远处接收日志 本地主机:1.修改链接设备成自定义名称为:LOCAL5 2.保存以后文件就不是记录在本地了,而是传到LOCAL5自定义设备了 3.修改rsyslog.config文件对应自定义的LOCAL5 4.重启日志配置文件 远程主机(接收端):1.修改日志配置文件,默认是不能接收外来日志的,需要修改 2.解禁这两行实现可以接收外来日志,并且指定接来的文