Source: transport.js

var _ = require('lodash')
    , EventEmitter = require('events').EventEmitter
    , util = require('util')
    , sprintf = util.format
    , fs = require('fs')
    , CConf = require('node-cconf')
    , CPlate = require('node-cplate').CPlate;

/**
 * Transport - A logging transport base class used by {@link CLogger.transports}.
 * @abstract
 * @memberof transports
 * @constructor
 * @param {string} name (optional) - An internal identifier.
 * @param {object} opts (optional) - An object, holding options to configure the transport.
 * @description Transport implementations inherit from this class and have to listen to
 * the 'log' event.
 */
function Transport(opts) {
    opts = opts || {};
    opts.name = opts.name || 'transport';

    EventEmitter.apply(this);

    var config = new CConf(opts.name).setDefault('filter', {}).load(opts);

    var filters = {
            /**
             * @method Transport.config.filter
             * @description A set of pre-defined filter functions for working with variables
             * in log-messages. These set contains the functions 'value', 'datetime', 'uppercase',
             * 'colorize' and 'capitalize'. Custom filters can be added in the transport configuration
             * and will be called with the return value of the previous filter in the chain,
             * a parameter and the log-arguments object {'id', 'timestamp', 'message', 'level'}.
             * The special filter 'value' should be the first function in a chain and returns the value
             * of the given parameter in the log-arguments object.
             * Filter calls are written between mustaches ('{{' and '}}'), delimited by a pipe ('|').
             * Filter-parameters are separated by a colon (':').
             * @example
             * var clogger = require('node-clogger');
             * var logFileTransport = new CLogger.transports.LogFile({
             *      'filename': '{{dirname}}/server.log',
             *      'format': '{{value:level|uppercase|colorize}}: {{value:message|capitalize|colorize:green}}',
             *      filter: {
             *          'dirname': function() {
             *              return __dirname;
             *          }
             *      }
             * });
             * var logger = new CLogger('server').addTransport(logFileTransport);
             * logger.info('This message goes to a logfile and the console...');
             */
            difference: function(value) {
                return sprintf('+%sms', value);
            }
        };
    config.setValue('filter', _.merge(filters, config.getValue('filter')));

    var cplate = new CPlate();
    _.forOwn(config.getValue('filter'), function(filter, name) {
        cplate.registerFilter(name, filter);
    });

    this.config = config;
    this.template = cplate;
}

util.inherits(Transport, EventEmitter);

module.exports.Transport      = Transport;
module.exports.Console        = require('./transports/console');
module.exports.CustomFunction = require('./transports/custom-function');
module.exports.LogFile        = require('./transports/log-file');
module.exports.TaffyDb        = require('./transports/taffy-db');

/*
var dir = __dirname + '/transports';
_.forEach(fs.readdirSync(dir), function(filename) {
    if (fs.statSync(dir.concat('/', filename)).isFile() && filename.match(/.*\.js$/)) {
        var name = filename[0].toUpperCase() + filename.slice(1);
        if (_.indexOf(filename, '-')) {
            name = _.map(filename.split('-'), function(part) {
                return part && part[0].toUpperCase() + part.slice(1);
            }).join('');
        }

        module.exports[name.replace('.js', '')] = require(dir.concat('/', filename));
    }
});
*/