stalker-server
Version:
A static server with realtime log parser
96 lines (89 loc) • 2.77 kB
JavaScript
var fs = require('fs');
var URL = require('url');
var path = require('path');
//存储对象池
var pool = {};
var Csver = function(filePath, fields, dimension) {
dimension = dimension || 'Hours';
this.dimension = dimension;
filePath = path.resolve(process.cwd(), filePath);
if (dimension) {
var dateTime = this.getDateTime(dimension);
var access_log = filePath + dateTime;
} else {
access_log = filePath;
}
this.filePath = filePath;
this.curDateTime = dateTime;
this.logStream = fs.createWriteStream(access_log, {
flags: 'a',
encoding: 'utf8'
});
this.fields = fields || {};
};
Csver.prototype.getDateTime = function(dimension) {
dimension = dimension || this.dimension;
var now = new Date();
var dateTime = '.' + now.getFullYear() + ('0' + (now.getMonth() + 1)).slice(-2);
var arr = ['Date', 'Hours'];
if (dimension !== 'Month') {
for (var i = 0, len = arr.length; i < len; i++) {
dateTime += ('0' + now['get' + arr[i]]()).slice(-2);
}
}
return dateTime;
};
Csver.prototype.task = function(data) {
// console.log(data);
if (!data) {
return;
}
var stream;
if (stream = this.logStream) {
var query = data.query;
var fields = data;
//处理fields
var orderMap = this.fields;
var result = orderMap.map(function(key) {
if (fields[key]) {
return getValue(fields[key]);
}
if (query[key]) {
return getValue(query[key]);
}
return getValue();
}).join(',') + '\n';
// console.log(result);
if (this.dimension) {
var dateTime = this.getDateTime(this.dimension);
if (this.curDateTime === dateTime) {
stream.write(result);
} else {
stream.end(result);
var access_log = this.filePath + dateTime;
this.logStream = fs.createWriteStream(access_log, {
flags: 'a',
encoding: 'utf8'
});
this.curDateTime = dateTime;
}
} else {
stream.write(result);
}
}
};
exports.init = function(settings, which) {
pool[which] = new Csver(settings.filePath, settings.fields || {}, settings.dimension);
}
exports.task = function(data, settings, which, globalSettings) {
if (pool[which]) {
pool[which].task(data, settings, which);
}
}
function getValue(v) {
if ((typeof v === 'number' && isNaN(v)) || typeof v === 'undefined' || v === '') {
return '""';
}
v = String(v).trim().replace(/"/g, '\"');
return '"' + v + '"';
}