Лесоруб Winston бросает ENOENT

Мой код:

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'

Результаты. журнал даже не создается

Обновление:когда я использую только имя файла без пути, это работает).

Связано, но не помогло решить:
Узел .js, не удается открыть файлы. Ошибка: ENOENT, stat './path/to/file'

В чем проблема?


person Gobliins    schedule 17.07.2017    source источник
comment
попробуйте проверить каталог chmod или создать файл вручную и т. д. Что-то изменилось?   -  person Taha Paksu    schedule 17.07.2017
comment
Существует ли каталог log?   -  person robertklep    schedule 17.07.2017
comment
@robertklep нет   -  person Gobliins    schedule 17.07.2017
comment
Уинстон не создаст его для вас.   -  person robertklep    schedule 17.07.2017
comment
@robertklep, вы можете добавить это как ответ   -  person Gobliins    schedule 17.07.2017


Ответы (1)


На самом деле Winston не создает каталог, в который вы хотите поместить файл журнала, поэтому вы получаете файл ENOENT.

(Я не очень хорошо знаком с Meteor, но следующие инструкции работают на «простом» Node.js)

Вы можете создать каталог вручную перед созданием экземпляра Winston, чтобы убедиться, что он существует, используя fs.mkdirSync, хотя это будет углубляться только на один уровень (он не будет создавать промежуточные каталоги, если они есть на пути).

Также существует mkdirp.sync(), который действительно создает промежуточные каталоги.

Использование синхронных версий немного проще, и, поскольку это операция, которая выполняется только один раз при запуске приложения, она не является узким местом.

person robertklep    schedule 17.07.2017