我有几个模块 - 比方说server.js,module1.js,...,moduleN.js。
我想定义我server.js日志文件:
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
然后在我的所有模块使用它。
什么是做到这一点的最好方法是什么? 我可以exports.winston=winston;
每个模块中,然后将其设置在server.js,但有没有更好的解决办法?
先感谢您!
Answer 1:
默认记录器的概念很好地处理这个问题。
温斯顿界定任何直接要求(以及随后的需要)默认记录器温斯顿将检索。 因此,你只需配置此默认记录一次,它可以通过香草随后组件的使用需要在其辉煌的扭捏多传输模式(“温斯顿”)。
例如,这里是我的完整记录设置定义3个运输。 我换Loggly 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 - 这是默认记录器一次性配置
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;
或者更复杂的情况,你可以使用温斯顿的容器中,在其他模块中一个名为容器检索记录。 我没有使用过这一点。
我这个唯一的问题是我的部署主机上缺少的日志目录这是很容易固定。
希望这可以帮助。
Answer 2:
怎么办?(这可能不是最好的办法)什么是使用“全局”模块,其中我出口的一切,我通过我的应用程序使用的东西。 例如:
//Define your winston instance
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
exports.logger = winston;
exports.otherGlobals = ....
现在只是需要从其他模块这一全球使用的模块
var Global = require(/path/to/global.js);
因为该文件被加载后第一次缓存(您可以通过在全局日志声明确认;它将只记录一次),有再次包括它非常小的开销。 将所有这些放到一个文件也比要求所有您的每一页上全球使用的模块更容易。
Answer 3:
我想用自定义颜色和水平。
所以我删除默认的控制台,运输和集彩色一个
这里是我的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');
Answer 4:
稍微偏离主题(如OP询问温斯顿),但我想通过本仁的“儿童记录器”的方法:
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: ...});
});
作为记录仪可通过REQ对象(因此没有必要“要求(日志)”每个模块中)它解决了OP的问题。 另外,属于特定请求的所有日志条目将有它们连接在一起的唯一ID。
{"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}
我不知道,如果温斯顿支持这一点。
Answer 5:
我创建一个新的温斯顿记录。
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");
Answer 6:
我现在很努力温斯顿3.0.0。 它似乎配置默认记录的方式已经改变了一点点。 这对我的工作方式是folloing:
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('log.js')
并且还require ('winston'),
而在所有其他文件,只是require('winston')
。
Answer 7:
如果你想记录器全球可变,你必须通过它分配给全局变量,像这样专门做
logger.js
var winston = require('winston')
var winston = winston.createLogger({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({
filename: './logs/logger.log'
})
]
});
module.exports=winston;
app.js
let logger = require('./logger')
global.__logger = logger
someController.js
__logger.info('created log successfully')
注:这是指定一个前缀为每一个全局变量,所以你会知道这是一个全球性的一个很好的做法。 我使用__作为前缀(双低破折号)
文章来源: using winston in several modules