我正在开发一个带有几十个模块的node.js应用程序,并使用bunyan进行日志记录(JSON输出,多个可配置流)。我一直在寻找如何在所有模块中实现实例的很好的例子,但是没有看到我可以从中学到的一个非常干净的例子。
下面说明了一种有效的方法,但对我来说似乎相当不雅(丑陋)。我是node&的新手。 commonjs javascript一般,所以寻找有关如何改进它的建议。
模块:./ lib / logger
// load config file (would like this to be passed in to the constructor)
nconf.file({ file: fileConfig});
var logSetting = nconf.get('log');
// instantiate the logger
var Bunyan = require('bunyan');
var log = new Bunyan({
name: logSetting.name,
streams : [
{ stream : process.stdout,
level : logSetting.stdoutLevel},
{ path : logSetting.logfile,
level : logSetting.logfileLevel}
],
serializers : Bunyan.stdSerializers
});
function Logger() {
};
Logger.prototype.info = function info(e) { log.info(e) };
Logger.prototype.debug = function debug(e) { log.debug(e) };
Logger.prototype.trace = function trace(e) { log.trace(e) };
Logger.prototype.error = function error(e) { log.error(e) };
Logger.prototype.warn = function warn(e) { log.warn(e) };
module.exports = Logger;
模块:主要应用
// create the logger
var logger = require('./lib/logger)
var log = new logger();
// note: would like to pass in options --> new logger(options)
module: any project module using logger
// open the logger (new, rely on singleton...)
var logger = require('./lib/logger');
var log = new logger();
任何建议?
编辑:
我修改了构造函数,使单例模式显式化(而不是隐式作为'require'行为的一部分。
var log = null;
function Logger(option) {
// make the singleton pattern explicit
if (!Logger.log) {
Logger.log = this;
}
return Logger.log;
};
然后更改初始化以采用选项参数
// initialize the logger
Logger.prototype.init = function init(options) {
log = new Bunyan({
name: options.name,
streams : [
{ stream : process.stdout,
level : options.stdoutLevel},
{ path : options.logfile,
level : options.logfileLevel}
],
serializers : Bunyan.stdSerializers
});
};
答案 0 :(得分:23)
Singleton pattern in nodejs - is it needed? 实际上,在Node的环境中可能不需要单例。您需要做的就是在一个单独的文件中创建一个记录器,例如logger.js:
var bunyan = require("bunyan"); // Bunyan dependency var logger = bunyan.createLogger({name: "myLogger"}); module.exports = logger;
然后,从另一个模块中检索此记录器:
var logger = require("./logger"); logger.info("Anything you like");
答案 1 :(得分:1)
如果您使用express与node.js,那么您可以试试这个。 默认情况下,Express中禁用日志记录。您必须执行某些操作才能使日志适用于您的应用。对于访问日志,我们需要使用Logger中间件;对于错误日志,我们将使用Forever.Hope它会帮助你.. 这是一个很好的示例How to Logging Access和node.js中的错误