通过终端监控这些日志时记录到文件(格式正确)

时间:2012-12-28 18:38:00

标签: javascript node.js logging terminal jake

我正在试图弄清楚从正在运行的jake任务中改进记录到终端的消息的最佳方法是什么。

我希望能够通过终端显示格式正确的消息,不仅包括正在运行的服务器,还包括可能正在运行的任何其他任务(包括从其他任务调用)。例如,假设我执行jake run以使服务器在开发时运行,它还会调用监视我的less css文件的jake watch任务以进行更改。它也可以调用jake unit(上面的例子中没有显示)来连续运行单元测试等......

我认为让记录器记录到文件(比如./dev.log)并且只是在tail -f任务中运行某种类型的jake run是有意义的(现在具有额外的好处)如果这是一个合理的方法,那么:

  • 如何使用终端颜色登录?和
  • 如何监控./dev.log的内容并将其流式传输到正在运行的任务/终端?

如果没有,并且你有更好的建议,你能否朝着正确的方向发展?如果实施,我将在此处分享解决方案。

谢谢!

示例代码

var servers = [
    {
        root: 'application',
        port: 8000
    },
    {
        root: 'dist',
        port: 8001
    }
];

// jake run
desc('Run when coding. (Watches files, compiles less, runs dev server, runs test, etc)');
task('run', {async: true}, function () {
    jake.Task.watch.invoke(); // invoking the 'watch' teask which I keep separate
    jake.logger.log('Starting static web servers:'); // simple logging through jake (this is what I'm trying to replace)
    var connect = require('connect');
    servers.forEach(function (server) {
        jake.logger.log('localhost:' + server.port + ' -> ' + server.root);
        connect(connect['static'](server.root)).listen(server.port);
    });
});

desc('Watches for changes to the main .less file');
task('watch', function () {
    var gaze = require('gaze');
    gaze(['application/css/style.less'], function (err, watcher) {
        this.on('all', function (event, filepath) {

            var fs = require('fs');
            var less = require('./node_modules/less/lib/less');
            var parser = new (less.Parser)({
                paths: ['./application/css'], // Specify search paths for @import directives
                filename: 'style.less'
            });
            parser.parse(fs.readFileSync('./application/css/style.less', 'utf8'), function (err, tree) {
                if (err) {
                    return console.error(err);
                    // TODO log error
                } else {
                    fs.writeFileSync('./application/css/style.css', tree.toCSS({ compress: true }));
                    jake.logger.log('application/css/style.less > application/css/style.css');
                    complete();
                    // TODO log success
                }
            });

        });
    });
});

1 个答案:

答案 0 :(得分:0)

找到一个解决方案:https://github.com/flatiron/winston

var colors = require('colors'); // in case I want to use color in messages
var winston = require('winston');
var logger = new (winston.Logger)({
    exitOnError: false,
    transports: [
        new (winston.transports.Console)({
            colorize: true,
            handleExceptions: true
        })
    ]
});
logger.cli();

然后在我的任务中:

logger.info('application/css/style.less > application/css/style.css');

logger.error("[" + err.type + "] [" + err.filename + ":" + err.line + "," + err.column + "]: " + err.message);

这对我来说很好。如果我可以将格式化程序功能传递给记录器,那就更好了,这样我就可以避免一遍又一遍地使用颜色,但是没有大问题。

非常感谢!