zoukankan      html  css  js  c++  java
  • GoLang fsnotify 实现目录中日志文件大小监控

    需求:

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

      需要引入第三方包:"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()
    }
    

      

    运行实例:

  • 相关阅读:
    tcprstat分析服务的响应速度
    mysqldump之不老将
    Java数据持久层框架 MyBatis之API学习二(入门)
    Java数据持久层框架 MyBatis之API学习一(简介)
    插入数据库日期格式转换
    eclipse出现错误:he type java.util.Map$Entry cannot be resolved. It is indirectly referenced
    注释中不允许出现字符串 "--"。
    mybatis if条件查询 及<号的问题
    This is probably because there is no OLE editor registered against the type of file you were trying to open.
    github not authorized eclipse
  • 原文地址:https://www.cnblogs.com/yzhch/p/6420625.html
Copyright © 2011-2022 走看看