NODE JS 日志选型

在对NODE的开发中,对日志的选型我剔除express的日志模块,主要是不能满足需求。

这里我特意选择了两种日志模块做为挑选之一

(参考:https://github.com/nomiddlename/log4js-node

第一种、Log4js

一、node + log4js

选择它的原因有

  1. node有log4js模块,我们可以直接安装
  2. log4js可以与express框架完美结合起来
  3. log4js可以将日志分为不同层级的异常或者错误,我们可以灵魂掌握

二、安装运行

废话不多说,我们现安装log4js,很简单:直接在您项目的根目录输入

npm install log4js // 安装成功的标志是在node_modules文件目录里生成log4js模块

简单配置,在配置之前,我们现了解下log4js输出的6个级别:trace, debug, info, warn, error, fatal

如果输出的级别是info,则不会打印低于info级别的日志(trace跟踪和debug调试),只会打印info信息、warm警告、error错误和fatal致命错误

我们简单的实验下,在app.js文件修改如下:

var log4js = require('log4js'); // 在项目中加入log4js模块
log4js.configure({
	appenders: [
        {
            type: "file", // 记录的日志类型是文件格式
            filename: "cheese.log", // 日志文件的名称
            category: [ 'cheese','console' ] 
        },
        {
            type: "console" // 在控制台中显示日志
        }
    ],
    replaceConsole: true // 替换console.log
});

我们可以发现在项目的根目录下生成了一个名称为cheese.log的日志文件,并且里面的内容为:[INFO] console - Express server listening on port     3000,与控制台的信息一致.

再进一步深入,我们在app.js中加入如下代码(Appender这里说明下,它是负责最终的日志写入

log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('ok.log'), 'ok'); // 这里我们又定义了一个新的日志记录文件ok.log,它的标记为ok
var logger = log4js.getLogger('cheese'); // 选择一个日志对象,这里我们选择上面定义的cheese
logger.setLevel('ERROR'); // 它的级别为error
console.error("啊哈,我发生了某些错误", { some: "AA", use: "自定义" }); // 这里发出了一个错误的输出
logger.trace('Entering cheese testing');
我们看看日志文件里面记录了什么,是的,你没有发现Entering cheese testing的字眼;这是因为我们设定的级别不需要记录trace的信息

我们继续实验,在app.js中再加入下列代码

logger.fatal('这是最高级别的错误.');
var anotherLogger = log4js.getLogger('another');
anotherLogger.debug("刚刚加入的");  // 无爹妈的孩子,无从查找,没有对应的日志文件
var okLog = log4js.getLogger('ok'); // 选择标识为ok的日志
okLog.debug("www.okhqb.com no1"); // 将调试信息输出

我们发现,fatal的信息是可以记录的,因为我们没有定义another标识的日志文件,所以"刚刚加入的"就无从记录;但是我们定义了ok,而且没有定义任何级别,所以“www.okhqb.com”就记录再ok.log文件中了。

使用配置文件代替在app中代码书写,如下面我有一个配置文件log4im.json, 然后在app.js加入log4js.configure('my_log4js_configuration.json',{});就可以了

{
  "appenders": [
    {
      "type": "file",
      "filename": "log_ok.log",
      "maxLogSize": 20480, // 日志最大文件限制
      "backups": 3,
      "category": "ok-logger" // 标识
    },
    {
      "type": "file",
      "absolute": true,
      "filename": "log_360.log",
      "maxLogSize": 20480,
      "backups": 10,
      "category": "360-logger" // 标识         
    }
  ]
} 

与node项目更好的结合起来,将app修改的全部注释,加入如下代码

log4js.configure({
 appenders: [
   { type: 'console' },
   { type: 'file', filename: 'cheese.log', category: 'cheese' }
  ]
});
var logger = log4js.getLogger('cheese');
logger.setLevel('INFO'); // 打印级别
app.configure(function() {
  app.use(log4js.connectLogger(logger, { level: log4js.levels.INFO })); // 设置node的级别
});
上面只是简要介绍了log4js的使用方法,它的功能远远不只这些。


第二种、winston

它是一个专门用于管理记录node的日志库,在githu中是fork最多的,我们来看看它有什么魅力;它的github地址是:https://github.com/flatiron/winston
Winston被设计为与多种传输支持一个简单而通用的日志库。winston记录器的每个实例都可以有不同程度的配置了多个位置。例如,我们可能想要的错误记录被到数据库,但其它信息我们希望输出到控制台


一、安装它很简单,直接npm install winston即可

二、使用

在app.js中输入如下代码

var winston = require('winston'); // 加入模版
winston.log('info', 'Hello distributed log files!'); // 一般的打印信息
winston.info('Hello again distributed logs'); //使用 info 级别记录信息
winston.add(winston.transports.File, { filename: 'somefile.log' }); //将日志信息记录到文件中
winston.remove(winston.transports.Console); 
上面的代码在启动的时回将日志信息输出,但是不会记录到somefile.log日志文件中,因为在定义文件前已经输出了,只要将期位置互换一下就可以记录日志信息

在介绍它的时候,提到我们可以自定义它,将它使用到我们想要的位置

如,修改app.js,注释掉上面的代码

var logger = new (winston.Logger)({
	transports: [
  		new (winston.transports.Console)(), // 控制台
  		new (winston.transports.File)({ filename: 'myfile.log' }) // 文件
	]
});
logger.log('info', 'Hello distributed log files!');
logger.info('Hello again distributed logs');
启动app,你会发现在你的项目根目录下有一个myfile.log的文件,打开它,里面记录了

{"level":"info","message":"Hello distributed log files!","timestamp":"2014-0    3-09T14:53:56.893Z"}
{"level":"info","message":"Hello again distributed logs","timestamp":"2014-0    3-09T14:53:56.895Z"}

两笔日志信息

二、日志级别

同log4js一样,它也有很多级别,看如下代码

  logger.log('silly', "127.0.0.1 - there's no place like home");
  logger.log('debug', "127.0.0.1 - there's no place like home");
  logger.log('verbose', "127.0.0.1 - there's no place like home");
  logger.log('info', "127.0.0.1 - there's no place like home");
  logger.log('warn', "127.0.0.1 - there's no place like home");
  logger.log('error', "127.0.0.1 - there's no place like home");
  logger.info("127.0.0.1 - there's no place like home");
  logger.warn("127.0.0.1 - there's no place like home");
  logger.error("127.0.0.1 - there's no place like home");
默认的级别时

  winston.log('info', "127.0.0.1 - there's no place like home");
  winston.info("127.0.0.1 - there's no place like home");
在项目中,我们定义日志级别可以这样设定

var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({ level: 'error' }),
      new (winston.transports.File)({ filename: 'somefile.log' })
    ]
  });

上面两种日志模块,我只是简单的了解;个人倾向于使用log4js,后面我回将这两种日志模块分别在IM中测试,在实际的运用中体验它们的优缺点,并最终建议使用那个日志模块

你可能感兴趣的:(JavaScript)