node.js - winston js tutorial
usando Winston en varios módulos (6)
El concepto de registrador predeterminado maneja esto muy bien.
Winston define un registrador predeterminado que recuperará cualquier solicitud directa (y posterior) de winston. Por lo tanto, simplemente configura este registrador predeterminado una vez, y está disponible para el uso posterior del módulo a través de vainilla require (''winston'') en su glorioso modo multi-transporte ajustado.
Por ejemplo, aquí está mi configuración completa de registro que define 3 transportes. Cambio Loggly por MongoDB algunas veces.
server.js
var logger=require(''./log.js'');
// requires winston and configures transports for winstons default logger- see code below.
todos los demás archivos .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: esta es una configuración única del registrador 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;
Alternativamente, para escenarios más complejos puede usar contenedores winston y recuperar el registrador de un contenedor nombrado en otros módulos. No he usado esto.
Mi único problema con esto era que faltaban los directorios de registros en mi host de implementación, que se solucionó fácilmente.
Espero que esto ayude.
Tengo varios módulos, digamos server.js, module1.js, ..., moduleN.js.
Me gustaría definir el archivo de registro en mi server.js:
winston.add(winston.transports.File, { filename: ''mylogfile.log'' });
y luego usarlo en todos mis módulos.
¿Cuál es la mejor manera de hacer eso? Podría exports.winston=winston;
en cada módulo y luego configurarlo en server.js, pero ¿hay alguna solución mejor?
¡Gracias de antemano!
Estoy creando un nuevo registrador de 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");
Estoy trabajando en Winston 3.0.0 en este momento. Y parece que la forma de configurar el registrador predeterminado ha cambiado un poco. La manera que funciona para mí es seguir:
log.js // la configuración para el registrador global
const winston= require(''winston'');
winston.configure({
level:"debug",
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
),
transports: [
new winston.transports.Console()
]
});
La otra parte es igual. Al principio de su aplicación, require this **log.js.**
, y también require (''winston''),
mientras que en todos los demás archivos, simplemente require(''winston'')
.
Lo que hago (que puede no ser la mejor manera) es usar un módulo ''global'' donde exporto todo lo que uso a través de mis aplicaciones. Por ejemplo:
//Define your winston instance
winston.add(winston.transports.File, { filename: ''mylogfile.log'' });
exports.logger = winston;
exports.otherGlobals = ....
Ahora solo requiere este módulo usado globalmente de sus otros módulos
var Global = require(/path/to/global.js);
Debido a que el archivo se almacena en caché después de la primera vez que se carga (que puede verificar al incluir una declaración de registro en su global, solo se registrará una vez), hay muy poca sobrecarga para incluirlo nuevamente. Ponerlo todo en un solo archivo también es más fácil que requerir TODOS los módulos utilizados a nivel mundial en cada página.
Quería usar colores y niveles personalizados.
Así que eliminé el transporte de consola predeterminado y configuré uno coloreado
aquí está mi 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;
Cargando desde app.js:
var logger = require(''./lib/log.js'');
Cargando desde otros módulos:
var logger = require(''winston'');
Un poco fuera de tema (como OP pregunta acerca de Winston), pero me gusta el enfoque ''niño-registrador'' de 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: ...});
});
Resuelve el problema del OP ya que el registrador está disponible a través del objeto de solicitud (por lo tanto, no es necesario ''requerir (registrar)'' en cada módulo). Además, todas las entradas de registro que pertenecen a una solicitud particular tendrán una ID única que las conecta entre sí.
{"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}
No estoy seguro si Winston apoya esto también.