使所有文件都可以访问winston记录器变量

时间:2017-11-05 18:41:44

标签: javascript node.js logging winston

我正在编写一个由许多节点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之前已经初始化了它。但它将记录器变量指定为未定义。

有人可以帮助我做错了吗?

2 个答案:

答案 0 :(得分:2)

你的记录器是 NOT 一个全局变量,他只存在于A.js. 如果你想让记录器成为一个全局变量 - 你必须通过将其分配给#include<stdio.h> void main() { int arr[]={10,20,30,40,50}; int *ptr=arr; //printf("%d",*ptr); printf("%d %d",*++ptr,*ptr++); } 变量来实现,如下所示:

global

注意:

为每个全局变量分配一个前缀是个好习惯,这样你才能知道它是一个全局变量。我正在使用__作为前缀(双低破折号)

答案 1 :(得分:0)

是的!您的记录器未定义,因为在该模块中您所做的只是将其声明为 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 函数不需要返回记录器。