calvinxiao / blog

Calvinxiao's blog
1 stars 0 forks source link

winston logger for 蜂巢 #1

Open calvinxiao opened 7 years ago

calvinxiao commented 7 years ago

winston logger for 蜂巢

公司的Node.js项目原本选用了bunyan作为日志输出工具,用kibana查找日志非常方便。

但是在使用蜂巢的过程中发现用蜂巢内置的日志工具看json日志非常不友好,而bunyan又不能输出非json日志,pipe到bunyan cli又会增加没必要的overhead。

这时候,决定切回winston,嗯切回,以前用过。。。

winston@npm

需要用到的自定义功能

  1. 本地开发时颜色输出, 使用选项colorize, 默认不输出颜色,本地开发的时候用环境变量LOG_COLOR控制
  2. 日志输出最低level,生产环境使用info,开发时用debug
  3. timestamp,默认是不输出的,设置成true的时候输出是0时区的,可以用moment().format()输出当地时区的日期格式(我们在东八区)
  4. logger支持string interpolation link,不错哦

支持category,也就是sub logger

winston的winston.loggers提供add和get的方法,可以支持自定义label输出

winston.loggers.add('my-router', {
    console: {
        level: 'debug',
        colorize: true,
        label: 'my-router',
        timestamp: function() {
            return moment().format();
        }
    }
})

var myLogger = winston.loggers.get('my-router');
myLogger.info('Hi its me');

// 输出
// 2016-12-23T15:52:16+08:00 - info: [my-router] Hi its me

get方法遇到不存的key会返回默认logger,可以用一个字典保存已有的label,遇到不存在的label就新建一个。

var loggerDict = {};
logger.getLogger = function(label) {
    if (!loggerDict[label]) {
        winston.loggers.add(label, {
            console: {
                level: config.log.level,
                colorize: showColor,
                label: label,
                timestamp: function() {
                    return moment().format();
                }
            }
        });
        loggerDict[label] = true;
    }
    return winston.logger.get(label);
};
calvinxiao commented 7 years ago

完整代码

var moment = require('moment')
var winston = require('winston')

var logger = new winston.Logger({
    transports: [
        new winston.transports.Console({
            json: false, // 在青云部署的app才开json,网易蜂巢的设置为false
            colorize: false, // 本机开发才开true,线上默认false, 本地开发用环境变量控制,叫LOG_COLOR
            timestamp: function() { return moment().format() }, // 输出当地时间
            level: 'debug', // 环境变量控制,开发时用debug, 默认info, 用LOG_LEVEL控制
        })
    ]
});

module.exports = logger;

// 下面的不要写到代码里面去

logger.info('calvin', {a:1})
logger.info({a:1})
logger.error('haha', new Error('abc'))

logger.debug('abc', 'abc', 'abc', {a:1})

logger.warn('warn')
logger.error('error')

winston.loggers.add('my-router', {
    console: {
        level: 'debug',
        colorize: true,
        label: 'my-router',
        timestamp: function() {
            return moment().format();
        }
    }
})

var myLogger = winston.loggers.get('my-router');
myLogger.info('Hi its me');

var nonLogger = winston.loggers.get('non-exist');
//console.log(nonLogger);
console.log(!!nonLogger);
nonLogger.info('what')