使用file-guard实时监控日志文件变化并自动报警
发布于 3 年前 作者 danlanxiaohei 2578 次浏览 来自 分享

背景: 当我们做项目的时候,日志是必不可少的,通常我们会写到日志文件里。 当出现问题的时候,我们会通过这些日志文件来分析问题。 但是,我们是怎么知道出问题了呢? 多数是有用户反馈或者公司群里开始议论了(最糟糕的是老板先发现了。。。) 这样就导致开发者很被动,很着急的去解决问题,压力很大,尤其是半夜接到老板电话的时候!!!


于是我就想,如果问题一出现,就能自动告诉我就好了! 这样就变 “被动” 为 “主动” ,即时发现问题,还没等老板打过来电话,我已经解决好了!(蜜汁微笑)

当然,关于如何定义 出问题了 是没有标准的,这里,我只是结合一些自己的经验。我的定义是:在短时间内有大量的错误日志。


于是 file-guard 应运而生: 它基于fs的监控,相当于是一个文件警卫,在文件 变化速度 超过 设定 时就发出警告。

先看代码:

'use strict'

const FileGuard = require('file-guard')

const guard = FileGuard({
  'root': 'data/logs',
  'file_filter': '*.log',
  'rate_limit': {'change_count': 10, 'in_milliseconds': 1 * 60 * 1000} // 10 changes in 1 minute
})

guard.on('alert', function (obj) {
  console.log('on alert ', obj)
  // 调用你的通知服务,例如微信、邮箱、短信
})

guard.startWatching()

这样就会监控 data/logs 文件夹下所有以 .log 结尾的文件,当任何一个文件的变化率超过 10次/1分钟 就会触发 alert 事件。

But

在实际开发中,通常会有大量的日志文件,而且一般会按照时间来做区分,比如每一天一个文件、每小时一个文件或者每分钟一个文件之类的。如何做到 动态匹配 呢?比如:只匹配当前小时的日志文件。

基于这种需求,file-guard 在初始化的时候允许file_filter传入一个函数,这个函数返回一个匹配字符串,这样就可以做到动态匹配。

既然是动态匹配,那什么时候去触发动态匹配呢?所以还要传入另外一个参数schedule_rule,file-guard的动态刷新匹配是基于node-schedule实现的,schedule_rule就是node-schedule所需要的参数。

直接上代码:

'use strict'
 
const FileGuard = require('file-guard')
const moment = require('moment')
 
const file_filter = function () {
  const hour = moment().format('YYYY-MM-DD-HH')
  return `*.${hour}.log` // 例如:*.2017-01-10-23.log
}
 
const guard = FileGuard({
  'root': 'data/logs',
  'file_filter': file_filter,
  'rate_limit': {'change_count': 10, 'in_milliseconds': 1 * 60 * 1000}, // 10 changes in 1 minute
  'schedule_rule': '0 0 * * * *'
})
 
guard.on('alert', function (obj) {
  console.log('on alert ', obj)
  // 调用你的通知服务,例如微信、邮箱、短信
})
 
guard.startWatching()

这个配置就会监控data/logs文件夹下所有以当前小时(例如: .2017-01-10-23.log)结尾的文件,而且每个小时的0分0秒都会刷新一些匹配规则,做到只匹配当前小时的log。

结语:

所以,到这里我们离成功只差一步,就是真实的通知到开发者,这里可以通过调用微信API、邮箱(qq + nodemailer)或者短信来实现,那就不属于本模块的范畴了。

欢迎大家评论、指正。

3 回复

哇塞,正好最近碰到了这样的需求。 感谢分享🙏

@Jiasm 多交流,哈哈

回到顶部