thinkt4nk
6/23/2014 - 5:44 PM

Parse Log Files - Execution Time

Parse Log Files - Execution Time

#!/usr/bin/env node
var fs = require('fs');
var moment = require('moment');

if (!!~process.argv.indexOf('-p') && process.argv.length === 4)
    parseLog(process.argv[3]);
else if (!!~process.argv.indexOf('-d')) {
    var infile = (process.argv.length > 3) ? process.argv[3] : null;
    dailyAverages(infile);
}
else {
    process.exit(usage());
}

process.on('SIGPIPE', process.exit);

function parseLog(infile) {
    var data = fs.readFileSync(infile, { encoding: 'utf8' });
    data.split(/\n/).forEach(function(row) {
        var response_time = row.replace(/^.*req-time-mus=(\d+).*/, '$1');
        var response_dt = row.replace(/^.*\[(.*?) \+\d+\].*$/, '$1');
        if (response_time && response_dt) {
            var write_row = response_dt + "," + response_time + "\n";
            process.stdout.write(write_row);
        }
    });
}

function dailyAverages(infile) {
    var dates = {};
    var date_order = [];
    var indata = "";
    var stream = (infile) ? fs.createReadStream(infile) : process.openStdin();
    // get lines
    stream.setEncoding('utf8');
    stream.on('data', function(chunk) {
        if (chunk !== null) {
            indata += chunk;
        }
    });
    stream.on('end', function() {
        lines = indata.split(/\n/);
        lines.forEach(function(line) {
            var date = line.replace(/^(\d{2}\/\w+\/\d{4}):(\d{2}:\d{2}:\d{2}).*$/, '$1 $2 UTC');
            var time = line.replace(/^.*,(\d+)$/, '$1');
            var dt = moment(date);
            if (dt.isValid()) {
                var date_string = dt.format('YYYY-MM-DD');
                if (!dates[date_string]) {
                    dates[date_string] = { count: 0, time: 0 };
                    date_order.push(date_string);
                }
                dates[date_string]['count'] += 1;
                dates[date_string]['time'] += parseInt(time);
            }
        });
        date_order.forEach(function(date) {
            var avg = dates[date]['time'] / dates[date]['count'];
            console.log(date + ',' + avg);
        });
    });
}

function usage() {
    var message = "" +
"Usage: \n" +
"   -p <input> display run time for each call in access log \n" +
"   -d <input> display daily averages for parsed access log \n";
    process.stdout.write(message);
    return 1;
}