【问题标题】:Winston logger throws ENOENT温斯顿记录器抛出 ENOENT
【发布时间】:2017-07-17 10:22:39
【问题描述】:

我的代码:

import winston from 'winston';

Meteor.startup(() => {
  const env = process.env.NODE_ENV || 'development';
  const tsFormat = () => (new Date()).toLocaleTimeString();
  const logDir = 'log';
  const logger1 = new (winston.Logger)({
    transports: [
      // colorize the output to the console
      new (winston.transports.Console)({
        timestamp: tsFormat,
        colorize: true,
        level: 'info',
      }),
      new (winston.transports.File)({
        filename: `${logDir}/results.log`,
        timestamp: tsFormat,
        level: env === 'development' ? 'debug' : 'info',
      }),
    ],
  });
  logger1.info('Hello world');
  //logger1.warn('Warning message');
  //logger1.debug('Debugging info');
});

输出:

I20170717-11:39:11.027(2)? 11:39:10 - info: Hello world
W20170717-11:39:11.150(2)? (STDERR)
W20170717-11:39:11.151(2)? (STDERR) events.js:72
W20170717-11:39:11.152(2)? (STDERR)         throw er; // Unhandled 'error' event
W20170717-11:39:11.152(2)? (STDERR)               ^
W20170717-11:39:11.153(2)? (STDERR) Error: ENOENT, open 'log/results.log'

甚至没有创建 results.log

更新:当我只使用没有路径的文件名时,它可以工作)。

相关但没有帮助解决:
Node.js, can't open files. Error: ENOENT, stat './path/to/file'

有什么问题?

【问题讨论】:

  • 尝试检查目录chmod,或手动创建文件等。有什么变化吗?
  • log 目录是否存在?
  • @robertklep nope
  • 温斯顿不会为你创建它。
  • @robertklep 您可以将其添加为答案

标签: javascript node.js meteor winston enoent


【解决方案1】:

Winston 实际上并没有创建您希望日志文件所在的目录,这就是您获得 ENOENT 的原因。

(我对 Meteor 不是很熟悉,但以下说明适用于“普通”Node.js)

您可以在实例化 Winston 之前手动创建目录以确保它存在,使用 fs.mkdirSync,尽管这只会深入一层(如果路径中有任何中间目录,它不会创建中间目录)。

还有mkdirp.sync()确实创建了中间目录。

使用同步版本更容易一些,而且由于它是在应用启动期间只发生一次的操作,所以它不是瓶颈。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 2014-01-19
    • 2017-03-23
    • 1970-01-01
    • 2018-07-27
    • 2019-05-13
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多