简单学习了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") }原文链接:https://www.f2er.com/go/190496.html