Подтвердить что ты не робот

Общий журнал для node, экспресс-приложение - лучшая практика?

Я работаю над приложением 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();

или просмотреть суть

какие-либо рекомендации?

EDIT:

Я изменил конструктор, сделав синтаксический шаблон явным (а не подразумеваемым как часть поведения 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     
    });
};
4b9b3361

Ответ 1

Синтаксический шаблон в nodejs - это нужно? На самом деле, singleton, возможно, не требуется в среде 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");

Ответ 2

если вы используете экспресс с помощью node.js, тогда вы можете попробовать это. По умолчанию регистрация отключена в Express. Вы должны делать определенные вещи, чтобы журналы работали для вашего приложения. Для журналов доступа нам необходимо использовать промежуточное программное обеспечение Logger; для журналов ошибок мы будем использовать Forever.Hope, это поможет вам.. Вот хороший пример Как регистрировать доступ и ошибки в node.js