Использование winston в нескольких модулях
У меня есть несколько модулей - скажем, server.js, module1.js,..., moduleN.js.
Я хотел бы определить файл журнала на моем сервере .js:
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
а затем использовать его во всех моих модулях.
Каков наилучший способ сделать это? Я мог exports.winston=winston;
в каждом модуле, а затем установить его в server.js, но есть ли лучшее решение?
Заранее благодарю вас!
Ответы
Ответ 1
Концепция логина по умолчанию отлично справляется с этим.
Winston определяет регистратор по умолчанию, который будет требовать любая прямая (и последующее требование) к winston. Таким образом, вы просто настраиваете этот логгер по умолчанию один раз, и он доступен для последующего использования модуля через ваниль, требуя ( "winston" ) в его великолепном измененном мультитранспорте.
например. вот моя полная настройка регистрации, которая определяет 3 транспорта. Я иногда меняю Логги для MongoDB.
server.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 - это одноразовая конфигурация регистратора DEFAULT
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 и извлекать регистратор из именованного контейнера в других модулях. Я не использовал это.
Моя единственная проблема с этим - отсутствие каталогов журналов на моем хосте развертывания, который был легко исправлен.
Надеюсь, что это поможет.
Ответ 2
Я хотел использовать пользовательские цвета и уровни.
Итак, я удалил консольный перенос по умолчанию и установил раскрашенное изображение
вот мой logger.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');
Ответ 3
То, что я делаю (что может быть не лучшим образом), использует "глобальный" модуль, в котором я экспортирую все материалы, которые я использую в своих приложениях.
Например:
//Define your winston instance
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
exports.logger = winston;
exports.otherGlobals = ....
Теперь просто используйте этот глобально используемый модуль из других модулей
var Global = require(/path/to/global.js);
Поскольку файл кэшируется после первого его загрузки (который вы можете проверить, включив в глобальный журнал оператор журнала, он будет регистрироваться только один раз), при этом его слишком мало накладных расходов. Включение всего этого в один файл также проще, чем требовать ВСЕ ваши глобально используемые модули на каждой странице.
Ответ 4
Слегка от темы (как 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 (отсюда нет необходимости "требовать (log)" в каждом модуле). Кроме того, все записи журнала, относящиеся к конкретному запросу, будут иметь уникальный идентификатор, который соединяет их вместе.
{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"[email protected]","time":"2014-05-26T18:27:43.530Z","v":0}
Я не уверен, поддерживает ли Winston это.
Ответ 5
Я создаю новый регистратор Winston.
log.js
'use strict';
const winston = require('winston');
module.exports = new(winston.Logger)({
transports: [
new(winston.transports.Console)({
level: 'info'
})
]
});
a.js
const log = require('./log');
log.info("from a.js");
b.js
const log = require('./log');
log.info("from b.js");