textual-log-parser
Version:
Parses Textual log files and returns JavaScript objects
102 lines (81 loc) • 2.44 kB
JavaScript
;
var fs = require('fs');
var path = require('path');
var readline = require('readline');
var stream = require('stream');
var async = require('async');
var moment = require('moment-timezone');
var dir;
function parse(directory, callback){
if(!directory)
throw 'textual-log-parser requires a directory to read logs from.';
dir = directory;
var directoryParts = path.resolve(directory).split(path.sep);
var meta = metaDetails(directoryParts);
console.log('parsing logs for ' + meta.title);
return fs.readdir(directory, function(error, files){
files = files.filter(function(file){
return file.substr(-4) === '.txt';
});
return async.map(files, readFileContent, function(error, results){
return callback(results, results.length, meta);
});
});
}
function metaDetails(parts){
return {
server: parts[parts.length - 3],
type: parts[parts.length - 2].toLowerCase(),
title: parts[parts.length - 1]
};
}
function readFileContent(file, callback){
var lines = [];
var instream = fs.createReadStream(path.join(dir, file));
var outstream = new stream;
outstream.readable = true;
outstream.writable = true;
var rl = readline.createInterface({
input: instream,
output: outstream,
terminal: false
});
rl.on('line', function(line){
lines.push(formatLine(line, file));
});
rl.on('close', function(){
callback(null, lines);
});
}
function formatLine(line, file){
// Remove empty lines, and lines with just 1 whitespace
if(!line || !line.length || line.length < 2)
return;
// Remove "Begin Session" and "End Session"
// Textual changed index of the session stamps, trying to avoid stripping lines if not Textual stamps
var indexOf = line.indexOf('—————————————');
if(indexOf === 0 || indexOf === 11 || indexOf === 27)
return;
return {
date: formatDate.apply(this, arguments),
value: trimLine(line)
};
}
function formatDate(line, file){
var date = /\[([^\]]+)\]/.exec(line);
date = date && date[1].trim();
if(date.indexOf('-') === -1){
var fileDate = file.slice(0, file.indexOf('.txt'));
date = fileDate.concat('T', date);
}
return moment(date).format();
}
function trimLine(line){
return line.replace(/\[([^\]]+)\]/, '').trim();
}
module.exports = {
parse: parse,
formatDate: formatDate,
trimLine: trimLine,
formatLine: formatLine
};