分享
  1. 首页
  2. 文章

使用golang切割nginx日志

phpwww · · 5044 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

简单学习了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")
}



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:phpwww

查看原文:使用golang切割nginx日志

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
5044 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏