【问题标题】:Make winston logger variable accessible to all files使所有文件都可以访问 winston 记录器变量
【发布时间】:2017-11-05 18:41:44
【问题描述】:

我正在编写一个由许多节点 js 脚本组成的节点 js 工具。对于日志记录,我使用的是winston。但我面临一个问题。首先,我制作了一个单独的 JS 文件,它具有创建记录器和清除记录器传输的功能,它看起来如下:-

'use strict';

var winston = require('winston');
var logger;

function createLogger(service) {
    logger = new (winston.Logger)({
        level: 'info',
        transports: [
            new winston.transports.File(
                {filename: ('logs/' + service + '_error.log'),
                json: false})
        ]
    });

    return logger;
}

function clearLogger() {
    logger.clear()
}

module.exports = {
    createLogger: createLogger,
    clearLogger: clearLogger,
    logger: logger
};

让我们将上述文件称为 logger-handler.js。现在,最初从 A.js 开始,我用一些服务名称调用了 createLogger 函数。它被实例化了,我可以在 A.js 中使用它。 A.js 调用了一些函数,比如 B.js。现在,如果我想在 B.js 中使用相同的记录器,我会收到记录器未定义的错误。为了在 B.js 中使用,我做了如下操作:-

var logger = require('./logger-handler').logger;

我认为它应该可以工作,因为 logger 是全局变量,并且我在使用 B.js 之前已经对其进行了初始化。但它将记录器变量分配为未定义。

有人可以帮我解决我做错的事情吗?

【问题讨论】:

  • 你能发布 A.js 吗?看起来你可能在实例化之前已经导入了 b 。另外我不明白你为什么需要公开createLogger,为什么不立即实例化记录器并公开loggerclearLogger

标签: javascript node.js logging winston


【解决方案1】:

您的记录器不是全局变量,他只存在于 A.js 中。 如果你想让记录器成为一个全局变量 - 你必须专门通过将它分配给 global 变量来做:

global.logger = logger;

注意:

最好为每个全局变量分配一个前缀,这样您就会知道这是一个全局变量。我使用 __ 作为前缀(双低破折号)

【讨论】:

    【解决方案2】:

    是的!您的记录器未定义,因为在该模块中您所做的只是将其声明为 var 并且在这样调用它之前从未创建记录器:

    var logger = require('./logger-handler').logger;
    

    你需要在调用它之前先初始化它,这样就可以了:

    import {createLogger, logger} from './logger-handler';
    
    //init your logger with the service name - based on whatever you wrote, so not too sure -
    createLogger("enter the service");
    
    //now your logger is ready to be used
    logger.log('info', 'all done');
    

    此外,您的 createlogger 函数不需要返回记录器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2022-08-16
      相关资源
      最近更新 更多