GoLang fsnotify 实现目录中日志文件大小监控

摘要:
要求:需要监听目录中的所有文件。当文件大小增加到某个阈值时,文件将被清空。需要引入第三方包:“github.com/howeyc/fsnotify”代码如下:packagemainimport(“log”“github.com/showeyc/fsnotify”“os”“fmt”“strconv”)funage(){fmt.Println(“”)fmt.Printf(“Usag”

需求:

  需要监听一个目录中所有文件,当文件大小增加到一定阀值,则将文件清空。

  需要引入第三方包:"github.com/howeyc/fsnotify"

  代码如下:

  

package main

import (
	"log"
	"github.com/howeyc/fsnotify"
	"os"
	"fmt"
	"strconv"
)

func usage()  {
	fmt.Println("")
	fmt.Printf("Usage: %s Montior-directory file-max-bytes-limit
",os.Args[0])
	fmt.Println("For example:")
	fmt.Printf("%s /opt/logs 1024
",os.Args[0])
	os.Exit(1)
}

func isDir(dirname string) bool  {
	fhandler, err := os.Stat(dirname);
	if(! (err == nil || os.IsExist(err)) ) {
		return false
	}else {
		return fhandler.IsDir()
	}
}

func isFile(filename string) bool  {
	fhandler, err := os.Stat(filename);
	if(! (err == nil || os.IsExist(err)) ) {
		return false
	}else if (fhandler.IsDir()){
		return false
	}
	return true
}

func emptiedFile(filename string) bool  {
	FN,err := os.Create(filename)
	defer FN.Close()
	if err != nil {
		return false
	}
	fmt.Fprint(FN,"")
	return true
}

func getFileByteSize(filename string) (bool,int64) {
	if (! isFile(filename)) {
		return false,0
	}
	fhandler, _ := os.Stat(filename);
	return true,fhandler.Size()
}

func main() {
	var maxByte int64 = 1024*1024
	if (len(os.Args) < 2) {
		usage()
	}
	if (len(os.Args) >= 3) {
		maxByte_,err := strconv.Atoi(os.Args[2])
		if err != nil {
			log.SetPrefix("[ERROR] ")
			log.Println(os.Args[2],"Is not a legitimate int number")
			usage()
		}
		maxByte = int64(maxByte_)
	}
	dirpath := os.Args[1]
	if (!isDir(dirpath)){
		log.SetPrefix("[ERROR] ")
		log.Println(dirpath,"Is not a legitimate directory")
		usage()
	}
	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		log.Fatal(err)
	}
	done := make(chan bool)

	//Process event
	go func() {
		for {
			select {
			case ev := <-watcher.Event:
				if(ev.IsModify()){
					_,size := getFileByteSize(ev.Name)
					log.Println("event:",ev,",byte:",size)
					if (size >= maxByte){
						if ( ! emptiedFile(ev.Name) ) {
							log.SetPrefix("[ERROR] ")
							log.Printf("%s :Can not empty file
",ev.Name)
						}
					}
				}
			case err := <-watcher.Error:
				log.Println("error:",err)
			}
		}
	}()
	err = watcher.Watch(dirpath)
	if err != nil {
		log.Fatal(err)
	}
	<-done

	watcher.Close()
}

  

运行实例:

GoLang fsnotify 实现目录中日志文件大小监控第1张

免责声明:文章转载自《GoLang fsnotify 实现目录中日志文件大小监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VLAD / NetVLAD / GhostVLADCMake安装(linux)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

C# 获取枚举 Enum 变量值的 Description 属性

如何在C#中读取枚举值的描述属性?有以下枚举:123456 public enum enum Langage{[System.ComponentModel.Description]Chinese,English}我们希望得到的是中文中的“Chinese”描述。123456789 publicstringGetEnumDescription{stringstr...

FTPClient

(iReplyCode==331||iReplyCode==230)){CloseSocketConnect();thrownewIOException(strReply.Substring(4));}if(iReplyCode!=230){SendCommand("PASS"+strRemotePass);if(!=null){SendCommand("Q...

TensorRT在ubuntu18.04的安装

安装TensorRT前需要安装Cuda和cudnn,安装步骤可以参考ubuntu安装cuda和cudnn。...

APP设计尺寸规范大全,APP界面设计新手教程【官方版】(转)

25学堂的老谭应广大群友的要求,特此整理最全的APP设计尺寸规范,同时也算是APP界面设计新手教程吧!25学堂官方QQ群:APP界面设计⑥群:366093026APPUI设计③群58946771APP设计资源⑤群38603292325学堂尽最大努力为APP设计师提供最全的APP设计素材APP设计知识。...

C#(winform)的label自动换行

Label是没有自动换行属性的,不像Textbox有WordWrap属性尽管没有自动换行的属性,但也能够自动换行,首先AutoSize改成false;然后调整Label的大小,长和宽...

sqlserver批量规律修改字段值

最近,有一项任务是将数据库中的3000多条数据从80万条进行编号,每个增量为1。有三种解决方案:1.在数据库中手动逐条添加。2.添加新的数据库字段,例如数字。将数字字段设置为标识栏。设置种子和增量。保存后,表格自动生成值,然后将字段设置为非标识列,并根据需要修改字段类型。3使用数据库语句(推荐)declare@numberint--定义变量@numberse...