Commit 885ab5d18d2ced21e8d97b582e9f6f4e3f21eb9a

Authored by Apichat.Tum
1 parent c1b0c854
Exists in master

add filename

index.js
... ... @@ -8,53 +8,57 @@ var joi = require('joi');
8 8  
9 9 module.exports = {
10 10  
11   - /*
12   - * opts: {
13   - * log: [dirname, rotation, maxsize]
14   - * stat: [dirname, rotation, maxsize, interval, key]
15   - * alarm: [dirname, rotation, maxsize]
16   - * }
17   - */
18   - init: function(opts) {
19   - var logstatalarm = undefined;
20   - validate.joi(opts, this.getSchema(), function(err, opts) {
21   - if(err) {
22   - throw new Error(err);
23   - }
24   - });
25   - return { log: new log(opts.dirname, opts.log),
26   - stat: new stat(opts.dirname, opts.stat, opts.alarm)
27   - };
28   - },
  11 + /*
  12 + * opts: {
  13 + * log: [dirname, rotation, maxsize]
  14 + * stat: [dirname, rotation, maxsize, interval, key]
  15 + * alarm: [dirname, rotation, maxsize]
  16 + * }
  17 + */
  18 + init: function (opts) {
  19 + var logstatalarm = undefined;
  20 + validate.joi(opts, this.getSchema(), function (err, opts) {
  21 + if (err) {
  22 + throw new Error(err);
  23 + }
  24 + });
  25 + return {
  26 + log: new log(opts.dirname, opts.log),
  27 + stat: new stat(opts.dirname, opts.stat, opts.alarm)
  28 + };
  29 + },
29 30  
30   - /*
31   - * Pre-define schema
32   - */
33   - getSchema: function() {
34   - return joi.object().keys({
35   - dirname: joi.string().required(),
36   - log: joi.object().keys({
37   - rotation: joi.number().min(0),
38   - maxsize: joi.number().min(0)
39   - }).required(),
40   - stat: joi.object().keys({
41   - rotation: joi.number().min(0),
42   - maxsize: joi.number().min(0),
43   - interval: joi.number().min(0),
44   - data: joi.array().items(joi.object().keys({
45   - key: joi.string().required(),
46   - threshold: joi.number().min(0),
47   - threshold_inv: joi.number().min(0)
48   - }))
49   - }).required(),
50   - alarm: joi.object().keys({
51   - rotation: joi.number().min(0),
52   - maxsize: joi.number().min(0),
53   - external: joi.array().items(joi.object().keys({
54   - fn: joi.func().required(),
55   - args: joi.array().items(joi.any())
56   - }))
57   - }).required()
58   - });
59   - }
60   -};
  31 + /*
  32 + * Pre-define schema
  33 + */
  34 + getSchema: function () {
  35 + return joi.object().keys({
  36 + dirname: joi.string().required(),
  37 + log: joi.object().keys({
  38 + rotation: joi.number().min(0),
  39 + maxsize: joi.number().min(0),
  40 + filename: joi.string()
  41 + }).required(),
  42 + stat: joi.object().keys({
  43 + rotation: joi.number().min(0),
  44 + maxsize: joi.number().min(0),
  45 + filename: joi.string(),
  46 + interval: joi.number().min(0),
  47 + data: joi.array().items(joi.object().keys({
  48 + key: joi.string().required(),
  49 + threshold: joi.number().min(0),
  50 + threshold_inv: joi.number().min(0)
  51 + }))
  52 + }).required(),
  53 + alarm: joi.object().keys({
  54 + rotation: joi.number().min(0),
  55 + maxsize: joi.number().min(0),
  56 + filename: joi.string(),
  57 + external: joi.array().items(joi.object().keys({
  58 + fn: joi.func().required(),
  59 + args: joi.array().items(joi.any())
  60 + }))
  61 + }).required()
  62 + });
  63 + }
  64 +};
61 65 \ No newline at end of file
... ...
model/alarm.js
... ... @@ -10,93 +10,94 @@ var _ = require('lodash');
10 10 * maxsize: interger (byte)
11 11 */
12 12 function alarm(dirname, opts) {
13   - opts = opts || {};
14   - this.dirname = dirname;
15   - this.rotation = opts.rotation || 15 * 60 * 1000;
16   - this.maxsize = opts.maxsize || 20000;
17   - this.external = opts.external || [];
18   - this.currentsize = 0;
19   - this.timestamp = 0;
20   - this.foldername = 'alarm/';
21   - helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`);
  13 + opts = opts || {};
  14 + this.dirname = dirname;
  15 + this.rotation = opts.rotation || 15 * 60 * 1000;
  16 + this.maxsize = opts.maxsize || 20000;
  17 + this.filename = opts.filename || '[log]YYYY-MM-DDTHH-mm-ss[_${count}.txt]';
  18 + this.external = opts.external || [];
  19 + this.currentsize = 0;
  20 + this.timestamp = 0;
  21 + this.foldername = 'alarm/';
  22 + helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`);
22 23 };
23 24  
24 25 /*
25 26 * parameters:
26 27 * data: any
27 28 */
28   -alarm.prototype.appendAlarm = function(data) {
29   - data = this.formatData(data);
30   - this.currentsize = this.currentsize + helper.getLengthOfContent(data);
31   - this.request(data);
32   - fs.appendFile(this.getDir(), data, function(err) {});
  29 +alarm.prototype.appendAlarm = function (data) {
  30 + data = this.formatData(data);
  31 + this.currentsize = this.currentsize + helper.getLengthOfContent(data);
  32 + this.request(data);
  33 + fs.appendFile(this.getDir(), data, function (err) {});
33 34 };
34 35  
35 36 /*
36 37 * parameters:
37 38 * none
38 39 */
39   -alarm.prototype.getDir = function() {
40   - var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation);
41   - this.resetCurrentSize(time.unix());
42   - time = time.format('YYYY-MM-DDTHH-mm-ss');
43   - var count = this.getCount();
44   - return `${this.dirname}${this.foldername}${time}_${count}.txt`;
  40 +alarm.prototype.getDir = function () {
  41 + var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation);
  42 + this.resetCurrentSize(time.unix());
  43 + var count = this.getCount();
  44 + time = time.format(this.filename.replace("${count}", count));
  45 + return `${this.dirname}${this.foldername}${time}`;
45 46 };
46 47  
47 48 /*
48 49 * parameters:
49 50 * time_unix: string
50 51 */
51   -alarm.prototype.resetCurrentSize = function(time_unix) {
52   - if(time_unix > this.timestamp) {
53   - this.currentsize = 0
54   - this.timestamp = time_unix;
55   - }
  52 +alarm.prototype.resetCurrentSize = function (time_unix) {
  53 + if (time_unix > this.timestamp) {
  54 + this.currentsize = 0
  55 + this.timestamp = time_unix;
  56 + }
56 57 };
57 58  
58 59 /*
59 60 * parameters:
60 61 * none
61 62 */
62   -alarm.prototype.getCount = function() {
63   - var count = Math.floor((this.currentsize / this.maxsize) + 1);
64   - return ((count * 1e-5).toFixed(5)).split('.')[1];
  63 +alarm.prototype.getCount = function () {
  64 + var count = Math.floor((this.currentsize / this.maxsize) + 1);
  65 + return ((count * 1e-5).toFixed(5)).split('.')[1];
65 66 };
66 67  
67 68 /*
68 69 * parameters:
69 70 * data: any
70 71 */
71   -alarm.prototype.formatData = function(data) {
72   - var date = moment().toISOString().trim();
73   - var timestamp = moment().unix();
74   - data = this._formatObject(data).trim();
75   - return `${date} ${timestamp} ${data}\r\n`;
  72 +alarm.prototype.formatData = function (data) {
  73 + var date = moment().toISOString().trim();
  74 + var timestamp = moment().unix();
  75 + data = this._formatObject(data).trim();
  76 + return `${date} ${timestamp} ${data}\r\n`;
76 77 };
77 78  
78 79 /*
79 80 * parameters:
80 81 * data: any
81 82 */
82   -alarm.prototype._formatObject = function(data) {
83   - if(_.isObject(data)) {
84   - return JSON.stringify(data);
85   - }
86   - if(_.isNumber(data)) {
87   - return toString(data);
88   - }
89   - return data;
  83 +alarm.prototype._formatObject = function (data) {
  84 + if (_.isObject(data)) {
  85 + return JSON.stringify(data);
  86 + }
  87 + if (_.isNumber(data)) {
  88 + return toString(data);
  89 + }
  90 + return data;
90 91 };
91 92  
92 93 /*
93 94 * parameters:
94 95 * data: any
95 96 */
96   -alarm.prototype.request = function(data) {
97   - _.forEach(this.external, function(external) {
98   - external.fn.apply(this, [data].concat(external.args));
99   - });
  97 +alarm.prototype.request = function (data) {
  98 + _.forEach(this.external, function (external) {
  99 + external.fn.apply(this, [data].concat(external.args));
  100 + });
100 101 };
101 102  
102 103 -module.exports = alarm;
  104 +module.exports = alarm;
103 105 \ No newline at end of file
... ...
model/log.js
... ... @@ -9,81 +9,82 @@ var _ = require('lodash');
9 9 * rotation: interger (ms)
10 10 */
11 11 function log(dirname, opts) {
12   - opts = opts || {};
13   - this.dirname = dirname;
14   - this.rotation = opts.rotation || 15 * 60 * 1000;
15   - this.maxsize = opts.maxsize || 20000;
16   - this.currentsize = 0;
17   - this.timestamp = 0;
18   - this.foldername = 'log/';
19   - helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`);
  12 + opts = opts || {};
  13 + this.dirname = dirname;
  14 + this.rotation = opts.rotation || 15 * 60 * 1000;
  15 + this.maxsize = opts.maxsize || 20000;
  16 + this.filename = opts.filename || '[log]YYYY-MM-DDTHH-mm-ss[_${count}.txt]';
  17 + this.currentsize = 0;
  18 + this.timestamp = 0;
  19 + this.foldername = 'log/';
  20 + helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`);
20 21 };
21 22  
22 23 /*
23 24 * parameters:
24 25 * data: any
25 26 */
26   -log.prototype.append = function(data) {
27   - data = this.formatData(data);
28   - this.currentsize = this.currentsize + helper.getLengthOfContent(data);
29   - fs.appendFile(this.getDir(), data, function(err) {});
  27 +log.prototype.append = function (data) {
  28 + data = this.formatData(data);
  29 + this.currentsize = this.currentsize + helper.getLengthOfContent(data);
  30 + fs.appendFile(this.getDir(), data, function (err) {});
30 31 };
31 32  
32 33 /*
33 34 * parameters:
34 35 * none
35 36 */
36   -log.prototype.getDir = function() {
37   - var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation);
38   - this.resetCurrentSize(time.unix());
39   - time = time.format('YYYY-MM-DDTHH-mm-ss');
40   - var count = this.getCount();
41   - return `${this.dirname}${this.foldername}${time}_${count}.txt`;
  37 +log.prototype.getDir = function () {
  38 + var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation);
  39 + this.resetCurrentSize(time.unix());
  40 + var count = this.getCount();
  41 + time = time.format(this.filename.replace("${count}", count));
  42 + return `${this.dirname}${this.foldername}${time}`;
42 43 };
43 44  
44 45 /*
45 46 * parameters:
46 47 * time_unix: string
47 48 */
48   -log.prototype.resetCurrentSize = function(time_unix) {
49   - if(time_unix > this.timestamp) {
50   - this.currentsize = 0
51   - this.timestamp = time_unix;
52   - }
  49 +log.prototype.resetCurrentSize = function (time_unix) {
  50 + if (time_unix > this.timestamp) {
  51 + this.currentsize = 0
  52 + this.timestamp = time_unix;
  53 + }
53 54 };
54 55  
55 56 /*
56 57 * parameters:
57 58 * none
58 59 */
59   -log.prototype.getCount = function() {
60   - var count = Math.floor((this.currentsize / this.maxsize) + 1);
61   - return ((count * 1e-5).toFixed(5)).split('.')[1];
  60 +log.prototype.getCount = function () {
  61 + var count = Math.floor((this.currentsize / this.maxsize) + 1);
  62 + return ((count * 1e-5).toFixed(5)).split('.')[1];
62 63 };
63 64  
64 65 /*
65 66 * parameters:
66 67 * data: any
67 68 */
68   -log.prototype.formatData = function(data) {
69   - var date = moment().toISOString().trim();
70   - var timestamp = moment().unix();
71   - data = this._formatObject(data).trim();
72   - return `${date} ${timestamp} ${data}\r\n`;
  69 +log.prototype.formatData = function (data) {
  70 + var date = moment().toISOString().trim();
  71 + var timestamp = moment().unix();
  72 + data = this._formatObject(data).trim();
  73 + return `${date} ${timestamp} ${data}\r\n`;
73 74 };
74 75  
75 76 /*
76 77 * parameters:
77 78 * data: any
78 79 */
79   -log.prototype._formatObject = function(data) {
80   - if(_.isObject(data)) {
81   - return JSON.stringify(data);
82   - }
83   - if(_.isNumber(data)) {
84   - return toString(data);
85   - }
86   - return data;
  80 +log.prototype._formatObject = function (data) {
  81 + if (_.isObject(data)) {
  82 + return JSON.stringify(data);
  83 + }
  84 + if (_.isNumber(data)) {
  85 + return toString(data);
  86 + }
  87 + return data;
87 88 };
88 89  
89 90 -module.exports = log;
  91 +module.exports = log;
90 92 \ No newline at end of file
... ...
model/stat.js
... ... @@ -14,31 +14,32 @@ var alarm = require('./alarm');
14 14 * alarm: object (alarm object)
15 15 */
16 16 function stat(dirname, opts, alarmData) {
17   - opts = opts || {};
18   - alarmData = alarmData || {};
19   - this.dirname = dirname;
20   - this.rotation = opts.rotation || 15 * 60 * 1000;
21   - this.maxsize = opts.maxsize || 20000;
22   - this.currentsize = 0;
23   - this.timestamp = 0;
24   - this.foldername = 'stat/';
25   - this.intervalId = undefined;
26   - this.interval = opts.interval || 60 * 1000;
27   - this.data = transformKeys(opts.data);
28   - this.rules = opts.data;
29   - this.alarm = new alarm(dirname, alarmData);
30   - helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`);
  17 + opts = opts || {};
  18 + alarmData = alarmData || {};
  19 + this.dirname = dirname;
  20 + this.rotation = opts.rotation || 15 * 60 * 1000;
  21 + this.maxsize = opts.maxsize || 20000;
  22 + this.filename = opts.filename || '[log]YYYY-MM-DDTHH-mm-ss[_${count}.txt]';
  23 + this.currentsize = 0;
  24 + this.timestamp = 0;
  25 + this.foldername = 'stat/';
  26 + this.intervalId = undefined;
  27 + this.interval = opts.interval || 60 * 1000;
  28 + this.data = transformKeys(opts.data);
  29 + this.rules = opts.data;
  30 + this.alarm = new alarm(dirname, alarmData);
  31 + helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`);
31 32 };
32 33  
33 34 function transformKeys(data) {
34   - keys = _.map(data, function(obj) {
35   - var fakey = {};
36   - fakey[obj.key] = 0;
37   - return fakey;
38   - });
39   - return _.reduce(keys, function(new_obj, obj) {
40   - return _.merge(new_obj, obj);
41   - }, {});
  35 + keys = _.map(data, function (obj) {
  36 + var fakey = {};
  37 + fakey[obj.key] = 0;
  38 + return fakey;
  39 + });
  40 + return _.reduce(keys, function (new_obj, obj) {
  41 + return _.merge(new_obj, obj);
  42 + }, {});
42 43  
43 44 };
44 45  
... ... @@ -48,132 +49,134 @@ function transformKeys(data) {
48 49 * rules: [obj]
49 50 */
50 51 function alarmDataOutOfThreshold(data, rules) {
51   - _alarm = [];
52   - _.forEach(data, function(v, k) {
53   - rule = _.find(rules, ['key', k]);
54   - var alarmObj = {};
55   - if(v < rule.threshold_inv) {
56   - _alarm.push({key: k,
57   - count: v,
58   - threshold_inv: rule.threshold_inv,
59   - message: `${k} count is below inverted threshold`});
60   - }
61   - if(v > rule.threshold) {
62   - _alarm.push({key: k,
63   - count: v,
64   - threshold:
65   - rule.threshold,
66   - message: `${k} count is above threshold`});
67   - }
68   - });
69   - return _alarm
  52 + _alarm = [];
  53 + _.forEach(data, function (v, k) {
  54 + rule = _.find(rules, ['key', k]);
  55 + var alarmObj = {};
  56 + if (v < rule.threshold_inv) {
  57 + _alarm.push({
  58 + key: k,
  59 + count: v,
  60 + threshold_inv: rule.threshold_inv,
  61 + message: `${k} count is below inverted threshold`
  62 + });
  63 + }
  64 + if (v > rule.threshold) {
  65 + _alarm.push({
  66 + key: k,
  67 + count: v,
  68 + threshold: rule.threshold,
  69 + message: `${k} count is above threshold`
  70 + });
  71 + }
  72 + });
  73 + return _alarm
70 74 };
71 75  
72 76 /*
73 77 * parameters:
74 78 * data: any
75 79 */
76   -stat.prototype.appendStat = function(data) {
77   - data = this.formatData(data);
78   - this.currentsize = this.currentsize + helper.getLengthOfContent(data);
79   - fs.appendFile(this.getDir(), data, function(err) {});
  80 +stat.prototype.appendStat = function (data) {
  81 + data = this.formatData(data);
  82 + this.currentsize = this.currentsize + helper.getLengthOfContent(data);
  83 + fs.appendFile(this.getDir(), data, function (err) {});
80 84 };
81 85  
82 86 /*
83 87 * parameters:
84 88 * none
85 89 */
86   -stat.prototype.start = function() {
87   - var self = this;
88   - this.intervalId = setInterval(function(){
89   - var alarmData = alarmDataOutOfThreshold(self.data, self.rules);
90   - if(!_.isEmpty(alarmData)) {
91   - self.alarm.appendAlarm(alarmData);
92   - }
93   - self.appendStat(self.data);
94   - self.reset();
95   - }, self.interval);
  90 +stat.prototype.start = function () {
  91 + var self = this;
  92 + this.intervalId = setInterval(function () {
  93 + var alarmData = alarmDataOutOfThreshold(self.data, self.rules);
  94 + if (!_.isEmpty(alarmData)) {
  95 + self.alarm.appendAlarm(alarmData);
  96 + }
  97 + self.appendStat(self.data);
  98 + self.reset();
  99 + }, self.interval);
96 100 };
97 101  
98 102 /*
99 103 * parameters:
100 104 * none
101 105 */
102   -stat.prototype.stop = function() {
103   - clearInterval(this.intervalId);
  106 +stat.prototype.stop = function () {
  107 + clearInterval(this.intervalId);
104 108 };
105 109  
106 110 /*
107 111 * parameters:
108 112 * data: string
109 113 */
110   -stat.prototype.increment = function(data) {
111   - if(_.has(this.data, data)) {
112   - this.data[data]++;
113   - }
114   - else this.data[data] = 1;
  114 +stat.prototype.increment = function (data) {
  115 + if (_.has(this.data, data)) {
  116 + this.data[data]++;
  117 + } else this.data[data] = 1;
115 118 };
116 119  
117 120 /*
118 121 * parameters:
119 122 * none
120 123 */
121   -stat.prototype.reset = function() {
122   - var self = this;
123   - _.forEach(this.data, function(v, k) {
124   - self.data[k] = 0;
125   - });
  124 +stat.prototype.reset = function () {
  125 + var self = this;
  126 + _.forEach(this.data, function (v, k) {
  127 + self.data[k] = 0;
  128 + });
126 129 };
127 130  
128 131 /*
129 132 * parameters:
130 133 * none
131 134 */
132   -stat.prototype.getDir = function() {
133   - var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation);
134   - this.resetCurrentSize(time.unix());
135   - time = time.format('YYYY-MM-DDTHH-mm-ss');
136   - var count = this.getCount();
137   - return `${this.dirname}${this.foldername}${time}_${count}.txt`;
  135 +stat.prototype.getDir = function () {
  136 + var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation);
  137 + this.resetCurrentSize(time.unix());
  138 + var count = this.getCount();
  139 + time = time.format(this.filename.replace("${count}", count));
  140 + return `${this.dirname}${this.foldername}${time}`;
138 141 };
139 142  
140 143 /*
141 144 * parameters:
142 145 * time_unix: string
143 146 */
144   -stat.prototype.resetCurrentSize = function(time_unix) {
145   - if(time_unix > this.timestamp) {
146   - this.currentsize = 0
147   - this.timestamp = time_unix;
148   - }
  147 +stat.prototype.resetCurrentSize = function (time_unix) {
  148 + if (time_unix > this.timestamp) {
  149 + this.currentsize = 0
  150 + this.timestamp = time_unix;
  151 + }
149 152 };
150 153  
151 154 /*
152 155 * parameters:
153 156 * none
154 157 */
155   -stat.prototype.getCount = function() {
156   - var count = Math.floor((this.currentsize / this.maxsize) + 1);
157   - return ((count * 1e-5).toFixed(5)).split('.')[1];
  158 +stat.prototype.getCount = function () {
  159 + var count = Math.floor((this.currentsize / this.maxsize) + 1);
  160 + return ((count * 1e-5).toFixed(5)).split('.')[1];
158 161 };
159 162  
160 163 /*
161 164 * parameters:
162 165 * data: any
163 166 */
164   -stat.prototype.formatData = function(data) {
165   - var date = moment().toISOString().trim();
166   - var timestamp = moment().unix();
167   - data = this._formatObject(data).trim();
168   - return `${date} ${timestamp} ${data}\r\n`;
  167 +stat.prototype.formatData = function (data) {
  168 + var date = moment().toISOString().trim();
  169 + var timestamp = moment().unix();
  170 + data = this._formatObject(data).trim();
  171 + return `${date} ${timestamp} ${data}\r\n`;
169 172 };
170 173  
171 174 /*
172 175 * parameters:
173 176 * data: any
174 177 */
175   -stat.prototype._formatObject = function(data) {
176   - return JSON.stringify(data);
  178 +stat.prototype._formatObject = function (data) {
  179 + return JSON.stringify(data);
177 180 };
178 181  
179 182 -module.exports = stat;
  183 +module.exports = stat;
180 184 \ No newline at end of file
... ...