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\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 实现目录中日志文件大小监控的更多相关文章
- 带你看懂大数据采集引擎之Flume&采集目录中的日志
一.Flume的介绍: Flume由Cloudera公司开发,是一种提供高可用.高可靠.分布式海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于采集数据:同时,flum ...
- SQL中減少日志文件大小
SQL中減少日志文件大小 编写人:CC阿爸 2014-6-14 在日常SQL数据库的操作中,常常会出现SQL日志文件超大,大小都超过正常MDF数据库文件,作为一般用户来讲,LDF太大,只会影响服务 ...
- golang开发:环境篇(六) Go运行监控Supervisord的使用
为什么要使用Supervisord 17年第一次写Go项目的时候,用Go开发项目倒没没费多大劲,很快就开发完成了.到了在测试环境部署的时候,由于不知道有 Supervisord 这个软件,着实花了些功 ...
- Golang 基于Prometheus Node_Exporter 开发自定义脚本监控
Golang 基于Prometheus Node_Exporter 开发自定义脚本监控 公司是今年决定将一些传统应用从虚拟机上迁移到Kubernetes上的,项目多而乱,所以迁移工作进展缓慢,为了建立 ...
- nginx日志的监控【转】
第一:nginx的基础监控: 1.进程监控 2.端口监控 在这里nginx的基础监控就不详细说了,注意的是:这两个是必须要加的.并且对于zabbix而言的话,一定要加上触发器的.有问题必须报警. 第二 ...
- logback 设置按天,文件切割大小,总共日志文件大小。
设置按天,文件切割大小,总共日志文件大小. <?xml version="1.0" encoding="UTF-8"?> <configura ...
- 【docker】docker限制日志文件大小的方法+查看日志文件的方法
一.docker日志文件的方法 除了 docker logs -f 容器ID/容器名 这个方法以外. 在linux上,一般docker的日志文件存储在/var/lib/docker/container ...
- Linux下日志文件监控系统Logwatch的使用记录
Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...
- Kubernetes之日志和监控(十五)
一.日志和监控 1.1.Log 1.1.1.容器级别 通过docker命令查看容器级别的日志 docker ps --->containerid docker logs containerid ...
随机推荐
- 如何打造VUCA时代的敏捷型组织?
王明兰 --原华为.微软创新与转型教练.华为云SaaS产品总监,著名精益&敏捷转型专家 VUCA最早来源于冷战时期,在现代世界意指商业世界越来越不确定性,越来越易变,越来越不可预测,我们已经进 ...
- Spring如何解决循环引用
概念 什么是循环引用? 故名思义,多个对象形成环路. 有哪几种循环引用? 在Spring中存在如下几种循环引用,一一举例分析一下 注入循环引用(Set注入 注解注入) package c.q.m; i ...
- 最全java多线程总结2--如何进行线程同步
上篇对线程的一些基础知识做了总结,本篇来对多线程编程中最重要,也是最麻烦的一个部分--同步,来做个总结. 创建线程并不难,难的是如何让多个线程能够良好的协作运行,大部分需要多线程处理的事情都不 ...
- sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)
问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...
- C++程序设计1(侯捷video 1-6)
一.头文件的防御式声明(video2) #ifndef __COMPLEX__ #define __COMPLEX__ //内容 #endif 二.初步感受模板(video2) 定义的时候: //复数 ...
- yii中find()指定条件
find()查找指定的条件 $modelName::model->find(); 使用条件对象 $criteria = new CDbCriteria(); $criteria->sele ...
- KVM虚拟机迁移至VMware
1.将kvm下虚拟机关机: [root@localhost ~]# virsh list --all Id Name State ----------------------------------- ...
- Spring Boot2(七):拦截器和过滤器
一.前言 过滤器和拦截器两者都具有AOP的切面思想,关于aop切面,可以看上一篇文章.过滤器filter和拦截器interceptor都属于面向切面编程的具体实现. 二.过滤器 过滤器工作原理 从上图 ...
- 图解AQS原理之ReentrantLock详解-非公平锁
概述 并发编程中,ReentrantLock的使用是比较多的,包括之前讲的LinkedBlockingQueue和ArrayBlockQueue的内部都是使用的ReentrantLock,谈到它又不能 ...
- OSPF 单区域实验
实验拓扑 实验需求 按照图示配置 IP 地址 按照图示分区域配置 OSPF ,实现全网互通 为了路由结构稳定,要求路由器使用环回口作为 Router-id 实验步骤 每台路由器都要将本地的所有直连网段 ...