背景: 当我们做项目的时候,日志是必不可少的,通常我们会写到日志文件里。 当出现问题的时候,我们会通过这些日志文件来分析问题。 但是,我们是怎么知道出问题了呢? 多数是有用户反馈或者公司群里开始议论了(最糟糕的是老板先发现了。。。) 这样就导致开发者很被动,很着急的去解决问题,压力很大,尤其是半夜接到老板电话的时候!!!
于是我就想,如果问题一出现,就能自动告诉我就好了! 这样就变 “被动” 为 “主动” ,即时发现问题,还没等老板打过来电话,我已经解决好了!(蜜汁微笑)
当然,关于如何定义 出问题了 是没有标准的,这里,我只是结合一些自己的经验。我的定义是:在短时间内有大量的错误日志。
于是 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)或者短信来实现,那就不属于本模块的范畴了。
欢迎大家评论、指正。