在其他模块中使用winston登录到文件失败

时间:2015-09-22 08:10:53

标签: node.js logging winston

我尝试使用winston登录文件,我有一个模块用于此任务,如下所示:

var logger = require('winston');

logger.add(logger.transports.File, {filename: '../../logs/logs.log', logstash: true});
logger.remove(logger.transports.Console);

function log(type, message) {
    logger.log(type, message, function(err, level, msg){
        if(err){
            console.log('error:', err);
        }
    });
}

module.exports = {
    log: log,
    logger: logger
};

我已尝试将logger对象本身和我自己的日志功能导出。

我第一次访问localhost时我什么都没得到(没有日志)。我第二次得到"错误:运输处于失败状态。"

但是,如果我通过调用我的log()函数来运行此模块,它可以正常工作并按预期记录到文件。

如何从其他模块创建winston日志文件?或者如何制作记录到文件的winston记录器。

记录到控制台始终有效。

完整的错误消息:

error: { [Error: Transport is in a failed state.]
  transport: 
   { domain: null,
     _events: { error: [Function] },
     _maxListeners: undefined,
     silent: false,
     raw: false,
     name: 'file',
     formatter: undefined,
     level: undefined,
     handleExceptions: false,
     exceptionsLevel: 'error',
     humanReadableUnhandledException: false,
     filename: 'logs.log',
     _basename: 'logs.log',
     dirname: '../../logs',
     options: { flags: 'a', highWaterMark: 24 },
     json: true,
     logstash: true,
     colorize: false,
     maxsize: null,
     rotationFormat: false,
     zippedArchive: false,
     maxFiles: null,
     prettyPrint: false,
     label: null,
     timestamp: true,
     eol: '\n',
     tailable: false,
     depth: null,
     showLevel: true,
     maxRetries: 2,
     stringify: undefined,
     _size: 0,
     _created: 0,
     _buffer: [],
     _draining: false,
     _opening: false,
     _failures: 2,
     _archive: null,
     _onError: [Function],
     opening: false,
     _stream: 
      { _writableState: [Object],
        writable: true,
        domain: null,
        _events: [Object],
        _maxListeners: Infinity,
        path: '../../logs/logs.log',
        fd: null,
        flags: 'a',
        mode: 438,
        start: undefined,
        pos: undefined,
        bytesWritten: 0,
        destroyed: true },
     _isStreams2: true } }

3 个答案:

答案 0 :(得分:1)

我刚刚意识到这个问题是在9个月前发布的。反正...

我认为你正在增加并发症。

我是这样做的:

// logger.js
var winston = require('winston');

var logger = new (winston.Logger)({
    transports: [
        new(winston.transports.File)({
            filename:'PATH_TO_LOG_FILE',
            handleExceptions: true,
            prettyPrint:true
        })
        // In case you need more transports uncomment:
        //,
        //new (winston.transports.Console)({
        //    level:'silly',
        //    handleExceptions: true,
        //    prettyPrint:true
        //})
    ],exitOnError:false
});

module.exports=logger;

在其他文件中使用记录器,只需:

var logger = require("PATH_TO_LOGGER");
logger.error("Unable to do stuff",err);

答案 1 :(得分:1)

分享我的发现:当我的记录器今天早上未能登录新功能(非常小)时,我感到很震惊。记录器之前正在工作。

原因:file.js中的log()(在winston库中)无法写入,因为 this.opening 标志仍然为true。我添加了一个小的超时例程来等待,超时允许打开完成。

希望这有帮助。

答案 2 :(得分:0)

因为记录器对于所有系统至关重要, 我的方法是将记录器放在global变量上,然后您可以从应用程序中的每个页面/模块进行记录。