использование winston в нескольких модулях

у меня есть несколько модулей - скажем, сервер.js, module1.js,...модуль.js.

Я хотел бы определить файл журнала на моем сервере.js:

winston.add(winston.transports.File, { filename: 'mylogfile.log' });

а затем используйте его во всех моих модулях.

каков наилучший способ сделать это? Я мог бы!--1--> в каждом модуле, а затем установите его на сервере.JS, но есть ли лучшее решение?

спасибо заранее!

6 ответов


концепция регистратора по умолчанию обрабатывает это красиво.

Winston определяет регистратор по умолчанию, который любой прямой требует (и последующие требуют), чтобы winston получит. Таким образом, вы просто настраиваете этот регистратор по умолчанию один раз, и он доступен для последующего использования модуля через vanilla require ("winston") в его славном настроенном многотранспортном режиме.

например, вот моя полная настройка ведения журнала, которая определяет 3 транспортов. Я своп инструмент loggly для MongoDB иногда.

сервер.js

var logger=require('./log.js'); 
// requires winston and configures transports for winstons default logger- see code below.

все другие .JS файлы

var logger=require('winston'); // this retrieves default logger which was configured in log.js
logger.info("the default logger with my tricked out transports is rockin this module");

log.js-это одноразовая конфигурация регистратора по умолчанию

var logger = require('winston');
var Loggly = require('winston-loggly').Loggly;
var loggly_options={ subdomain: "mysubdomain", inputToken: "efake000-000d-000e-a000-xfakee000a00" }
logger.add(Loggly, loggly_options);
logger.add(winston.transports.File, { filename: "../logs/production.log" });
logger.info('Chill Winston, the logs are being captured 3 ways- console, file, and Loggly');
module.exports=logger;

альтернативно для более сложных сценариев вы можете использовать контейнеры winston и получить регистратор из именованного контейнера в других модулях. Я этим не пользовался.

моей единственной проблемой с этим был отсутствующий каталог журналов на моем хосте развертывания, который был легко зафиксированный.

надеюсь, что это помогает.


что я делаю (что может быть не лучшим способом), это использовать "глобальный" модуль, где я экспортирую все, что я использую через свои приложения. Например:

//Define your winston instance
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
exports.logger = winston;

exports.otherGlobals = ....

теперь просто требуйте этого глобально используемого модуля от ваших других модулей

var Global = require(/path/to/global.js);

поскольку файл кэшируется после первой загрузки (что вы можете проверить, включив оператор log в свой глобальный; он будет регистрироваться только один раз), очень мало накладных расходов при включении его снова. Ставлю все в один файл также проще, чем требовать все ваши глобально используемые модули на каждой странице.


Я хочу использовать пользовательские цвета и уровни.

поэтому я удалил консоль-транспорт по умолчанию и установил раскрашенный

вот мой регистратор.js

var logger = require('winston');

logger.setLevels({
    debug:0,
    info: 1,
    silly:2,
    warn: 3,
    error:4,
});
logger.addColors({
    debug: 'green',
    info:  'cyan',
    silly: 'magenta',
    warn:  'yellow',
    error: 'red'
});

logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, { level: 'debug', colorize:true });

module.exports = logger;



загрузка из App.js:

var logger = require('./lib/log.js');  



загрузка из других модулей:

 var logger = require('winston');        

немного не по теме (Как OP спрашивает о Winston), но мне нравится подход "child-logger" от Bunyan:

var bunyan = require('bunyan');
var log = bunyan.createLogger({name: 'myapp'});

app.use(function(req, res, next) {
  req.log = log.child({reqId: uuid()});
  next();
});

app.get('/', function(req, res) {
  req.log.info({user: ...});
});

он решает проблему OP, поскольку регистратор доступен через объект req(следовательно, нет необходимости в "require (log)" в каждом модуле). Кроме того, все записи журнала, принадлежащие конкретному запросу, будут иметь уникальный идентификатор, который соединяет их вместе.

{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"...@gmail.com","time":"2014-05-26T18:27:43.530Z","v":0}

Я не уверен, что Уинстон поддерживает это.


Я создаю новый Winston logger.

log.js

'use strict';

const winston = require('winston');

module.exports = new(winston.Logger)({
    transports: [
        new(winston.transports.Console)({
            level: 'info'
        })
    ]
});

а.Яш

const log = require('./log');

log.info("from a.js");

б.Яш

const log = require('./log');

log.info("from b.js");

Я работаю над Уинстон 3.0.0 прямо сейчас. И, похоже, способ настройки регистратора по умолчанию немного изменился. Способ, который работает для меня после:

log.js / / настройка глобального регистратора

const winston= require('winston');

winston.configure({
  level:"debug",
  format: winston.format.combine(
    winston.format.colorize(),
    winston.format.simple()
  ),
  transports: [
    new winston.transports.Console()
  ]
});

другая часть такая же. В начале вашего приложения,require this **log.js.**, а также require ('winston'), В то время как во всех других файлах, просто require('winston')

.