在winston日志条目中添加模块名称

时间:2017-03-17 13:17:26

标签: node.js winston

是否有可能保存当前模块名称,以便在以后调用winston日志条目时自动打印?

目前,当我想在日志中打印模块名称时,我必须手动添加它:

var logHeader = 'mymodule'

log.info(logHeader + 'Hello')

例如,使用debug,您可以执行此操作(暂时忽略日志格式功能%s):

var debug = require('debug')('http')
  , name = 'My App'

debug('booting %s', name);

这将在日志前面加上http前缀:

  

http启动我的应用

这可以在温斯顿完成吗?我在文档中搜索过但找不到任何相关内容。

4 个答案:

答案 0 :(得分:15)

我找到了一种更好的方法。

我在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:信息日志示例

module2.js

var log = require('log')(__filename)

log.error('Error log example')
  

错误:C:\ Users \ user1 \ project \ module2.js:错误日志示例

另外,通过这种方式,我不需要在提交文本日志的任何地方进行更改; log.info('text')完全像以前一样。

答案 1 :(得分:8)

这就是子记录器的用途。当问到这个问题时,它们可能不可用,但为了将来参考,您可以创建主记录器实例,然后导出一个函数,该函数使用一些默认选项创建子记录器。

// 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

答案 2 :(得分:3)

您可以使用 Winston 指定custom log format -

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

因此,您的模块名称将附加到每个日志消息中。

答案 3 :(得分:0)

使用 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!"