使用现有的 winston 记录器
Using an existing winston logger
我是 Node.js
和 Javascript 的新手,所以我仍在学习来龙去脉。我来自 python 背景。
我有一个可导入的函数,它创建一个记录器,并将记录对象传递回 main
脚本。
我正在将其他模块导入 main
脚本,我希望它们使用相同的日志记录 object/settings。
在 Python 中,记录器对象是一个单例对象 - 当从下标或导入方法再次实例化时 - 将获取所有现有传输。
在 JS 中也可以做到这一点,而不必只将 logger
对象作为函数的参数传入吗?
logger.js
const { createLogger, transports } = require("winston");
let { format } = require("winston");
let logger;
let log_level;
let logfile;
let screendump;
function formatParams(info) { (...snip...) }
//Set format default here
format = format.combine( ...snip ...);
module.exports = {
set: function (argv) { // defaults
/* Set logging. Can be set by command line or config file */
var log_level = ( process.env.log_level != null ? process.env.log_level : argv["log_level"] ) // Can end as undefined
var logfile = ( process.env.logfile != null ? process.env.logfile : argv["logfile"] ) // Can end as undefined
var screendump = ( process.env.screendump != null ? process.env.screendump : argv["screendump"]) // Can end as undefined
// Put a check in here to ensure "formatting" is a format object
if ( typeof formatting !== 'undefined') { format = formatting; }
logger = createLogger({
level : log_level,
format: format,
transports: [
// Start with everything going to dev null...just to satisfy
// Winston's requirement for at least one transport.
// Add more later
new transports.File({ filename: '/dev/null', level: 'error' }),
]
});
// put a file check in here
if ( typeof logfile !== 'undefined' ) {
logger.add(new transports.File({ filename: logfile, format: format }) )
}
if ( typeof screendump !== 'undefined' || screendump != false) {
logger.add(new transports.Console({ format: format }) );
}
return logger;
},
};
main.js
var log = require('./logger');
require('./mySubFunction')();
logger = log.set(argv);
logger.log('info',"Logger successfully started!");
mySubFunction(param = 10);
mySubFunction.js
logger = <import existing logger object created by main?>
module.exports = function() {
this.mySubFunction = function (param) { // defaults
var i;
for (i = 0; i < param; i++) {
logger.log('info', "This is iteration" + String(i));
}
return;
}
}
您可以在一个文件中创建一个记录器实例并将其导出,从而创建一个单例。
logger.js
var createLogger = require('winston');
module.exports = createLogger();
somethingElse.js
var logger = require('./logger');
process.argv
是全局的,因此您不必从 main
.
传递它
我是 Node.js
和 Javascript 的新手,所以我仍在学习来龙去脉。我来自 python 背景。
我有一个可导入的函数,它创建一个记录器,并将记录对象传递回 main
脚本。
我正在将其他模块导入 main
脚本,我希望它们使用相同的日志记录 object/settings。
在 Python 中,记录器对象是一个单例对象 - 当从下标或导入方法再次实例化时 - 将获取所有现有传输。
在 JS 中也可以做到这一点,而不必只将 logger
对象作为函数的参数传入吗?
logger.js
const { createLogger, transports } = require("winston");
let { format } = require("winston");
let logger;
let log_level;
let logfile;
let screendump;
function formatParams(info) { (...snip...) }
//Set format default here
format = format.combine( ...snip ...);
module.exports = {
set: function (argv) { // defaults
/* Set logging. Can be set by command line or config file */
var log_level = ( process.env.log_level != null ? process.env.log_level : argv["log_level"] ) // Can end as undefined
var logfile = ( process.env.logfile != null ? process.env.logfile : argv["logfile"] ) // Can end as undefined
var screendump = ( process.env.screendump != null ? process.env.screendump : argv["screendump"]) // Can end as undefined
// Put a check in here to ensure "formatting" is a format object
if ( typeof formatting !== 'undefined') { format = formatting; }
logger = createLogger({
level : log_level,
format: format,
transports: [
// Start with everything going to dev null...just to satisfy
// Winston's requirement for at least one transport.
// Add more later
new transports.File({ filename: '/dev/null', level: 'error' }),
]
});
// put a file check in here
if ( typeof logfile !== 'undefined' ) {
logger.add(new transports.File({ filename: logfile, format: format }) )
}
if ( typeof screendump !== 'undefined' || screendump != false) {
logger.add(new transports.Console({ format: format }) );
}
return logger;
},
};
main.js
var log = require('./logger');
require('./mySubFunction')();
logger = log.set(argv);
logger.log('info',"Logger successfully started!");
mySubFunction(param = 10);
mySubFunction.js
logger = <import existing logger object created by main?>
module.exports = function() {
this.mySubFunction = function (param) { // defaults
var i;
for (i = 0; i < param; i++) {
logger.log('info', "This is iteration" + String(i));
}
return;
}
}
您可以在一个文件中创建一个记录器实例并将其导出,从而创建一个单例。
logger.js
var createLogger = require('winston');
module.exports = createLogger();
somethingElse.js
var logger = require('./logger');
process.argv
是全局的,因此您不必从 main
.