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 ...
随机推荐
- Spring Boot之Actuator的端点
Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况.有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何 ...
- vue路由传参query和params的区别(详解!)
1.query使用path和name传参都可以,而params只能使用name传参. query传参: 页面: this.$router.push({ path:'/city',name:'City' ...
- Null作为参数的时候,Java编译器如何调用函数?
public class TestNull { public void method(Object o){ System.out.println("Object Version") ...
- DFS(一):深度优先搜索的基本思想
采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...
- 【HDU - 2181】哈密顿绕行世界问题(dfs+回溯)
-->哈密顿绕行世界问题 Descriptions: 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前2 ...
- Jrebel激活服务搭建
前言 因为平时的开发工具是使用IntelliJ IDEA,所以热部署项目代码的时候,使用的Jrebel.因为Jrebel是收费的,所以以前用的时候都是在网上找破解方法(国人通用做法),在网上找到的办法 ...
- gh-ost
目录 1.简介 2.为什么不用触发器 ? 3.命名由来 4.亮点 5.使用 6.它是如何工作的? 7.工作模式 7.1.模式1 -- 连上从库,在主库上修改 7.2.模式2 -- 直接在主库上修改 7 ...
- (转)User-Agent的由来(原来这么有意思)
你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ( ...
- Android实现跳转到应用市场进行版本更新功能
最近需要做应用版本更新功能,因为之前已经写过一篇版本更新的功能了,虽然请求接口还是用的HttpUrlConnection,想着改改现在应用使用的请求方式也挺快的嘛,心里开始暗喜,可以偷偷懒了,哈哈哈. ...
- C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载
普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表 ...