简单学习了golang/go语言的基础语法,做个定时切割Nginx日志的小脚本练习下,感觉挺好使的~
脚本代码如下,install后将脚本加入到crontab定时运行,当然golang也可以自己定时执行,这里加入到crontab运行,是因为golang进程有可能会被kill掉....
package main
import (
"fmt"
"os"
"path/filepath"
"syscall"
"time"
"strings"
"os/exec"
"io/IoUtil"
)
func main(){
//日志目录
srcDirPath := "/usr/local/Nginx/logs"
//存放切割日志目录
targetDirPath := "/usr/local/Nginx/logs/history"
//ngixn进程ID文件
NginxPidpath := "/usr/local/Nginx/logs/Nginx.pid"
//检查存放切割日志目录是否存在,如果不存在则创建
finfo,errFile := os.Stat(targetDirPath)
if errFile !=nil {
errFile := os.MkdirAll(targetDirPath,0777)
if errFile != nil {
fmt.Println("创建日志目录失败:"+errFile.Error())
return
}
} else if !finfo.IsDir() {
fmt.Println(targetDirPath+"已经存在且不是一个目录")
return
}
//获取当前日期,作为此次切割日志根目录
t := time.Now()
NowDateTime := t.Format("2006-01-02")
logPath := targetDirPath+"/"+NowDateTime
os.MkdirAll(logPath,0777)
//获取Nginx的进程ID
pfile,err := os.Open(NginxPidpath)
defer pfile.Close()
if err != nil {
fmt.Println("not found Nginx pid file")
return
}
pidData,_ := IoUtil.ReadAll(pfile)
pid := string(pidData)
pid = strings.Replace(pid,"\n","",-1)
//遍历日志目录
filepath.Walk(srcDirPath,func(path string,info os.FileInfo,err error) error {
if info.IsDir() {
return nil
} else {
//获取切割日志路径
targetfilePath := strings.Replace(path,srcDirPath,logPath,1)
if strings.Index(targetfilePath,"Nginx.pid") != -1 {
return nil
}
//移动文件
syscall.Rename(path,targetfilePath)
//创建原文件,这里不需要了,因为重启Nginx后会自动生成滴
// nFile,errCreate := os.Create(path)
// if errCreate != nil {
// fmt.Println("create file faild:"+errCreate.Error())
// }
// defer nFile.Close()
}
return nil
})
//平滑重启Nginx
cmd := exec.Command("kill","-USR1",pid)
_,errCmd := cmd.Output()
if errCmd != nil {
fmt.Println("重启Nginx失败:"+errCmd.Error())
return;
}
fmt.Println("success")
}
小编说
以上是编程之家为你收集整理的使用golang切割nginx日志全部内容。
如果觉得编程之家网站内容还不错,欢迎将编程之家推荐给好友。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。