Node.js 温斯顿:尝试在没有传输的情况下写入日志

Node.js 温斯顿:尝试在没有传输的情况下写入日志,node.js,express,npm,winston,Node.js,Express,Npm,Winston,我试图使用Winston为我的express服务器设置访问日志和错误日志,但我似乎做错了什么 以下是我对配置文件的尝试: const winston = require('winston'), fs = require('fs'); const tsFormat = () => (new Date()).toLocaleTimeString(); winston.loggers.add('errorLog', { file: { f

我试图使用Winston为我的express服务器设置访问日志和错误日志,但我似乎做错了什么

以下是我对配置文件的尝试:

const winston = require('winston'),
    fs = require('fs');

const tsFormat = () => (new Date()).toLocaleTimeString();
winston.loggers.add('errorLog', {
        file: {
                filename: '<path>/errors.log', //<path> is replaced by the 
                timestamp: tsFormat,           //absolute path of the log
                level: 'info'
        }

});
winston.loggers.add('accessLog', {
        file: {
                filename: '<path>/access.log', //same as before
                timestamp: tsFormat,
                level: 'info'
        }
});
在我看来,它似乎遵循文档() 但当我尝试登录到它时,会出现以下错误:

[winston] Attempt to write logs with no transports {"message":"pls","level":"info"}
[winston] Attempt to write logs with no transports {"message":"Bad request: undefined","level":"warn"}

任何帮助都将不胜感激,我已经被难住了几天。

我会尝试这样的方法,将所有与记录器相关的内容放入模块logger.js:

logger.js

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

logger.errorLog.info('Test error log');
logger.accessLog.info('Test access log');
var logPath = '';
var log_level = '';

const log = winston.createLogger({
  level: log_level,
  format: winston.format.json(),
  transports: [
    new winston.transports.File({
      filename: path.join(logPath, 'access.log'),
      timestamp: tsFormat,
      level: log_level
    }),
    new winston.transports.File({
      filename: path.join(logPath, 'error.log'),
      timestamp: tsFormat,
      level: 'error'
    }),
  ]
});

if (process.env.NODE_ENV !== 'production') {
  log.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}

module.exports = {
  log: log
};
const logger = require('./logger');

logger.log.info("starting application..");
var winston=require('winston');
var path=require('path');
//默认情况下,将此设置为脚本的路径。
var logPath=\uuu dirname;
const tsFormat=()=>(new Date().toISOString());
const errorLog=winston.createLogger({
运输:[
新的winston.transports.File({
文件名:path.join(logPath,'errors.log'),
时间戳:tsFormat,
级别:“信息”
})
]
});
const accessLog=winston.createLogger({
运输:[
新的winston.transports.File({
文件名:path.join(logPath'access.log'),
时间戳:tsFormat,
级别:“信息”
})
]
});
module.exports={
errorLog:errorLog,
访问日志:访问日志
};
然后在index.js中进行测试:

index.js

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

logger.errorLog.info('Test error log');
logger.accessLog.info('Test access log');
var logPath = '';
var log_level = '';

const log = winston.createLogger({
  level: log_level,
  format: winston.format.json(),
  transports: [
    new winston.transports.File({
      filename: path.join(logPath, 'access.log'),
      timestamp: tsFormat,
      level: log_level
    }),
    new winston.transports.File({
      filename: path.join(logPath, 'error.log'),
      timestamp: tsFormat,
      level: 'error'
    }),
  ]
});

if (process.env.NODE_ENV !== 'production') {
  log.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}

module.exports = {
  log: log
};
const logger = require('./logger');

logger.log.info("starting application..");
您应该看到如下日志行:

errors.log:

{"level":"info","message":"Test access log","timestamp":"2018-03-14T07:51:11.185Z"}
access.log:

{"level":"info","message":"Test error log","timestamp":"2018-03-14T07:51:11.182Z"}
编辑

在Winston版本3.x.x上,
new(Winston.Logger)
已被
Winston.createLogger
()


1个用于开发目的的记录器+控制台日志记录:

logger.js

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

logger.errorLog.info('Test error log');
logger.accessLog.info('Test access log');
var logPath = '';
var log_level = '';

const log = winston.createLogger({
  level: log_level,
  format: winston.format.json(),
  transports: [
    new winston.transports.File({
      filename: path.join(logPath, 'access.log'),
      timestamp: tsFormat,
      level: log_level
    }),
    new winston.transports.File({
      filename: path.join(logPath, 'error.log'),
      timestamp: tsFormat,
      level: 'error'
    }),
  ]
});

if (process.env.NODE_ENV !== 'production') {
  log.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}

module.exports = {
  log: log
};
const logger = require('./logger');

logger.log.info("starting application..");
app.js

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

logger.errorLog.info('Test error log');
logger.accessLog.info('Test access log');
var logPath = '';
var log_level = '';

const log = winston.createLogger({
  level: log_level,
  format: winston.format.json(),
  transports: [
    new winston.transports.File({
      filename: path.join(logPath, 'access.log'),
      timestamp: tsFormat,
      level: log_level
    }),
    new winston.transports.File({
      filename: path.join(logPath, 'error.log'),
      timestamp: tsFormat,
      level: 'error'
    }),
  ]
});

if (process.env.NODE_ENV !== 'production') {
  log.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}

module.exports = {
  log: log
};
const logger = require('./logger');

logger.log.info("starting application..");

由于您在原始代码中将
winston
变量创建为
const winston
,因此无法在以下行中添加传输和其他选项。建议的解决方案将类似的代码移动到一个模块中,但将
winston
变量分配到
var winston

这很有效,谢谢!这实际上接近于我原来的状态,但我不断地出错。不知道有什么不同,但它现在可以工作了。很好,通常只有一两行代码,但发现问题仍然很痛苦!注意:即使不从模块中导出记录器,这仍然有效-代码的不同之处在于,
logger.js
模块现在正在
index.js
中加载/执行,这将触发
winston.loggers.add
调用,因此,使记录器可供
winston.loggers.get
。这避免了使用
记录器。添加
记录器。获取包的
方法——这是OPs最初的问题;而是创建记录器的实例并从模块中导出它们。