需求:

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

  需要引入第三方包:"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\n",os.Args[0])
fmt.Println("For example:")
fmt.Printf("%s /opt/logs 1024\n",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\n",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. 带你看懂大数据采集引擎之Flume&采集目录中的日志

    一.Flume的介绍: Flume由Cloudera公司开发,是一种提供高可用.高可靠.分布式海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于采集数据:同时,flum ...

  2. SQL中減少日志文件大小

    SQL中減少日志文件大小   编写人:CC阿爸 2014-6-14 在日常SQL数据库的操作中,常常会出现SQL日志文件超大,大小都超过正常MDF数据库文件,作为一般用户来讲,LDF太大,只会影响服务 ...

  3. golang开发:环境篇(六) Go运行监控Supervisord的使用

    为什么要使用Supervisord 17年第一次写Go项目的时候,用Go开发项目倒没没费多大劲,很快就开发完成了.到了在测试环境部署的时候,由于不知道有 Supervisord 这个软件,着实花了些功 ...

  4. Golang 基于Prometheus Node_Exporter 开发自定义脚本监控

    Golang 基于Prometheus Node_Exporter 开发自定义脚本监控 公司是今年决定将一些传统应用从虚拟机上迁移到Kubernetes上的,项目多而乱,所以迁移工作进展缓慢,为了建立 ...

  5. nginx日志的监控【转】

    第一:nginx的基础监控: 1.进程监控 2.端口监控 在这里nginx的基础监控就不详细说了,注意的是:这两个是必须要加的.并且对于zabbix而言的话,一定要加上触发器的.有问题必须报警. 第二 ...

  6. logback 设置按天,文件切割大小,总共日志文件大小。

    设置按天,文件切割大小,总共日志文件大小. <?xml version="1.0" encoding="UTF-8"?> <configura ...

  7. 【docker】docker限制日志文件大小的方法+查看日志文件的方法

    一.docker日志文件的方法 除了 docker logs -f 容器ID/容器名 这个方法以外. 在linux上,一般docker的日志文件存储在/var/lib/docker/container ...

  8. Linux下日志文件监控系统Logwatch的使用记录

    Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...

  9. Kubernetes之日志和监控(十五)

    一.日志和监控 1.1.Log 1.1.1.容器级别 通过docker命令查看容器级别的日志 docker ps --->containerid docker logs containerid ...

随机推荐

  1. Python实现按键精灵(二)-找图找色

    一.实现功能 判断在指定坐标范围内,是否存在相似度大于n的图片,并返回坐标. 二.基本思路 A=你需要寻找的图片 B=截取当前页面中指定范围的图片 利用opencv 判断A在B中的位置, 在该位置截取 ...

  2. webpack 编译ES6

    虽然js的es6是大势之趋,但很多浏览器还没有完全支持ES6语法,webpack可以进行对es6打包编译 需要安装的包有 npm init // 初始化 npm install babel-loade ...

  3. 有关Html页面节点的简单理解

    这是之前研究web前端的一点经验,主要针对刚入门还没怎么研究的朋友. 因为我发现我在用js,css参与过网站开发项目后仍然没有理解文本节点与普通节点的差别,所以记下来拿来分享一下. 先上结论:< ...

  4. laravel扩展包-私有库

    创建一个新的laravel项目 composer create-project --prefer-dist laravel/laravel laravel-package "5.5.*&qu ...

  5. 为什么string是引用类型 值还不可以修改

    C#把数据类型分为值类型和引用类型.值类型操作简单,引用类型更省空间. C#一共有15个预定义类型,其中13个值类型(8个整型.2个浮点类型.decimal.bool.char),2个引用类型(str ...

  6. 自己挖的坑跪着也要填完---mapper配置文件和java源文件在同一包下

    本来准备研究下mybatis源码执行流程的,就随意搭建了个项目,所有配置如下: 一切看似都是那么的正常,然而执行的时候:Exception in thread "main" org ...

  7. Selenium Grid分布式测试环境搭建

    Selenium Grid简介 Selenium Grid实际上是基于Selenium RC的,而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成.Hub用来管理各个代理节点的注册信息 ...

  8. C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP

    P2458 [SDOI2006]保安站岗 没学树形DP的,看一下. 题目大意:一棵树有N个节点,现在需要将所有节点都看守住,如果我们选择了节点i,那么节点i本身,节点i的父亲和儿子都会被看守住. 每个 ...

  9. restapi(0)- 平台数据维护,写在前面

    在云计算的推动下,软件系统发展趋于平台化.云平台系统一般都是分布式的集群系统,采用大数据技术.在这方面akka提供了比较完整的开发技术支持.我在上一个系列有关CQRS的博客中按照实际应用的要求对akk ...

  10. web前端css(二)

    一.  标准文档流 标准文档流中会有一些现象: 空白折叠 和 高低不齐边底对齐的现象 标准文档流等级森严, 标签分为两种等级: 行内元素 和 块级元素. 1. 行内元素 和 块级元素的区别: 行内元素 ...