использование winston в нескольких модулях
у меня есть несколько модулей - скажем, сервер.js, module1.js,...- модуль.js.
Я хотел бы определить файл журнала на моем сервере.js:
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
и затем использовать его во всех моих модулей.
каков наилучший способ сделать это? Я мог бы exports.winston=winston; в каждом модуле и затем установить его на сервере.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');
немного не по теме (Как ОП спрашивает о Уинстоне), но мне нравится подход "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":"[email protected]","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').
Comments