简单学习了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 举报,一经查实,本站将立刻删除。