用cron,logrotate为服务做日志轮转| 青训营笔记

274 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

为什么要做日志轮转

服务运行的时候需要有日志记录,这样在出bug的时候,可以通过日志去查bug的原因。首先日志需要保存到本地,但是如果保存的太大了,在查询的时候会造成io阻塞,或者是我们在查询bug的时候带来不好的阅读体验。所以需要对日志进行切分,我这篇笔记所做的就是每天定时把日志打包。结合我们组所做的抖声项目,就不采用青训营课程中介绍的分布式定时任务,采用的单机定时任务,也就是cron + logorate

步骤

  • 编写产生日志文件的程序
  • 配置logrotate相关目录和文件
  • 验证结果

编写产生日志文件的程序

package main

import (
   "log"
   "time"
)

func main() {
   for {
      t := time.Now().Format("2006-01-02 15:04:05")
      log.Println(t + ":  Log Message")
      time.Sleep(time.Second)
   }
}

配置logrotate相关目录和文件

[root@nginx log]# cat /etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
	minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}
# 下面这个是我自己添加的,上面的是自带的配置。
/root/test-log/log/runtime.log {
    daily #每天轮转日志
    create 0664 root root # 创建新的日志文件时给予文件的权限
    rotate 5 #轮转日志的数量 所以最多能保存六天的日志信息 当日的日志+过去5天
}
# system-specific logs may be also be configured here.

验证结果

运行产生日志文件的程序,通过nohup将控制台的输出输入到指定的log文件

nohup go run log.go > log/runtime.log 2>&1 &

log/runtime.log

[root@nginx log]# cat runtime.log 
nohup: 忽略输入
2022/06/08 19:48:48 2022-06-08 19:48:48:  Log Message
2022/06/08 19:48:49 2022-06-08 19:48:49:  Log Message
2022/06/08 19:48:50 2022-06-08 19:48:50:  Log Message
2022/06/08 19:48:51 2022-06-08 19:48:51:  Log Message
2022/06/08 19:48:52 2022-06-08 19:48:52:  Log Message
2022/06/08 19:48:53 2022-06-08 19:48:53:  Log Message
2022/06/08 19:48:54 2022-06-08 19:48:54:  Log Message
2022/06/08 19:48:55 2022-06-08 19:48:55:  Log Message
2022/06/08 19:48:56 2022-06-08 19:48:56:  Log Message
2022/06/08 19:48:57 2022-06-08 19:48:57:  Log Message
2022/06/08 19:48:58 2022-06-08 19:48:58:  Log Message
2022/06/08 19:48:59 2022-06-08 19:48:59:  Log Message
2022/06/08 19:49:00 2022-06-08 19:49:00:  Log Message
2022/06/08 19:49:01 2022-06-08 19:49:01:  Log Message
2022/06/08 19:49:02 2022-06-08 19:49:02:  Log Message

强制日志轮转用来测试

logrotate -f /etc/logrotate.conf 

自动生成了一个当日的日志文件

[root@nginx log]# ll
总用量 12
-rw-rw-r--. 1 root root    0 6月   8 19:50 runtime.log
-rw-rw-r--. 1 root root 8660 6月   8 19:51 runtime.log-20220608

查看原来的日志 已经记录新的日志了

[root@nginx log]# cat runtime.log
2022/06/08 19:49:18 2022-06-08 19:49:18:  Log Message
2022/06/08 19:49:19 2022-06-08 19:49:19:  Log Message
2022/06/08 19:49:20 2022-06-08 19:49:20:  Log Message
2022/06/08 19:49:21 2022-06-08 19:49:21:  Log Message
2022/06/08 19:49:22 2022-06-08 19:49:22:  Log Message
2022/06/08 19:49:23 2022-06-08 19:49:23:  Log Message
2022/06/08 19:49:24 2022-06-08 19:49:24:  Log Message