在 winston 日志条目中添加模块名称
Add module name in winston log entries
是否可以保存当前模块名称以便在以后调用时自动打印在 winston 日志条目中?
目前,当我想在日志中打印模块名称时,我必须手动添加:
var logHeader = 'mymodule'
log.info(logHeader + 'Hello')
例如,使用 debug,您可以这样做(暂时忽略日志格式功能 %s
):
var debug = require('debug')('http')
, name = 'My App'
debug('booting %s', name);
这将在日志前添加 http
前缀:
http booting My App
这在温斯顿可以做到吗?我在文档中进行了搜索,但找不到任何相关内容。
您可以指定 custom log format 与 Winston -
var moduleName = 'myModule';
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
formatter: function(options) {
// Return string will be passed to logger.
return moduleName + ' - ' + (options.message ? options.message : '')
}
})
]
});
logger.info('This is a log message');
这将打印 -
myModule - This is a log message
因此您的模块名称将附加到每条日志消息中。
我找到了更好的方法。
我在 winston
记录器上添加了一个附加层,在本例中是一个函数,它为需要记录器的每个模块保留模块名称。因此,当模块 require
是我的新记录器时,它实际上使用模块名称调用导出的函数,在本例中为 __filename
.
log.js
var winston = require('winston')
var winstonLogger = new (winston.Logger)({
transports: [
new (winston.transports.File) ({
filename: 'MyLogs.txt',
handleExceptions: true,
humanReadableUnhandledException: true,
level: 'info',
timestamp: true,
json: false
}),
new (winston.transports.Console) ({
level: 'info',
prettyPrint: true,
colorize: true,
timestamp: true
})
]
})
module.exports = function(fileName) {
var myLogger = {
error: function(text) {
winstonLogger.error(fileName + ': ' + text)
},
info: function(text) {
winstonLogger.info(fileName + ': ' + text)
}
}
return myLogger
}
module1.js
var log = require('log')(__filename)
log.info('Info log example')
info: C:\Users\user1\project\module1.js: Info log example
module2.js
var log = require('log')(__filename)
log.error('Error log example')
error: C:\Users\user1\project\module2.js: Error log example
此外,这样一来,我提交文本日志的方式就无需更改任何地方; log.info('text')
和以前一样。
使用 winston v3.3.3,您可以使用 winston.format.label
和自定义 winston.format.printf
:
来完成此操作
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.label({label: 'mymodule'}),
winston.format.printf(({label, message}) => {
return `${label}: ${message}`;
})
),
transports: [
new winston.transports.Console(),
],
});
logger.info('Hello, World!'); // prints "mymodule: Hello, World!"
这就是 儿童记录器 的用途。在询问此问题时,它们可能不可用,但为了将来参考,您可以创建主记录器实例,然后导出一个函数,该函数使用一些默认选项创建子记录器。
// logging.js
const winston = require('winston')
const logger = winston.createLogger({
transports: [
new winston.transports.Console({
format: winston.format.printf(options => {
// you can pass any custom variable in options by calling
// logger.log({level: 'debug', message: 'hi', moduleName: 'my_module' })
return `[${options.moduleName}] ${options.level}: ${options.message}$`;
})
})
]
});
module.exports = function(name) {
// set the default moduleName of the child
return logger.child({moduleName: name});
}
然后在每个模块的顶部,使用以下方法导入子模块:
// my_module.js
const logger = require('./logging.js')('my_module_name');
logger.error('computer says no');
// output:
// [my_module_name] error: computer says no
是否可以保存当前模块名称以便在以后调用时自动打印在 winston 日志条目中?
目前,当我想在日志中打印模块名称时,我必须手动添加:
var logHeader = 'mymodule'
log.info(logHeader + 'Hello')
例如,使用 debug,您可以这样做(暂时忽略日志格式功能 %s
):
var debug = require('debug')('http')
, name = 'My App'
debug('booting %s', name);
这将在日志前添加 http
前缀:
http booting My App
这在温斯顿可以做到吗?我在文档中进行了搜索,但找不到任何相关内容。
您可以指定 custom log format 与 Winston -
var moduleName = 'myModule';
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
formatter: function(options) {
// Return string will be passed to logger.
return moduleName + ' - ' + (options.message ? options.message : '')
}
})
]
});
logger.info('This is a log message');
这将打印 -
myModule - This is a log message
因此您的模块名称将附加到每条日志消息中。
我找到了更好的方法。
我在 winston
记录器上添加了一个附加层,在本例中是一个函数,它为需要记录器的每个模块保留模块名称。因此,当模块 require
是我的新记录器时,它实际上使用模块名称调用导出的函数,在本例中为 __filename
.
log.js
var winston = require('winston')
var winstonLogger = new (winston.Logger)({
transports: [
new (winston.transports.File) ({
filename: 'MyLogs.txt',
handleExceptions: true,
humanReadableUnhandledException: true,
level: 'info',
timestamp: true,
json: false
}),
new (winston.transports.Console) ({
level: 'info',
prettyPrint: true,
colorize: true,
timestamp: true
})
]
})
module.exports = function(fileName) {
var myLogger = {
error: function(text) {
winstonLogger.error(fileName + ': ' + text)
},
info: function(text) {
winstonLogger.info(fileName + ': ' + text)
}
}
return myLogger
}
module1.js
var log = require('log')(__filename)
log.info('Info log example')
info: C:\Users\user1\project\module1.js: Info log example
module2.js
var log = require('log')(__filename)
log.error('Error log example')
error: C:\Users\user1\project\module2.js: Error log example
此外,这样一来,我提交文本日志的方式就无需更改任何地方; log.info('text')
和以前一样。
使用 winston v3.3.3,您可以使用 winston.format.label
和自定义 winston.format.printf
:
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.label({label: 'mymodule'}),
winston.format.printf(({label, message}) => {
return `${label}: ${message}`;
})
),
transports: [
new winston.transports.Console(),
],
});
logger.info('Hello, World!'); // prints "mymodule: Hello, World!"
这就是 儿童记录器 的用途。在询问此问题时,它们可能不可用,但为了将来参考,您可以创建主记录器实例,然后导出一个函数,该函数使用一些默认选项创建子记录器。
// logging.js
const winston = require('winston')
const logger = winston.createLogger({
transports: [
new winston.transports.Console({
format: winston.format.printf(options => {
// you can pass any custom variable in options by calling
// logger.log({level: 'debug', message: 'hi', moduleName: 'my_module' })
return `[${options.moduleName}] ${options.level}: ${options.message}$`;
})
})
]
});
module.exports = function(name) {
// set the default moduleName of the child
return logger.child({moduleName: name});
}
然后在每个模块的顶部,使用以下方法导入子模块:
// my_module.js
const logger = require('./logging.js')('my_module_name');
logger.error('computer says no');
// output:
// [my_module_name] error: computer says no