log4js для Node не выводится в файл, только в консоль

Мне нужна базовая система ведения журнала для приложения NodeJS, поэтому я провожу некоторые тесты с log4js, который кажется стандартным для этих случаев. Мне нужно распечатать сообщения как на консоль, так и в файл, поэтому я написал этот код:

// Logger
var log4js = require('log4js');

log4js.configure({
  appenders: {
    'console': { type: 'console' },
    'file': { type: 'file', filename: 'logs/mailer.log' }
  },
  categories: {
    default: { appenders: ['file', 'console'], level: 'DEBUG' },
  }
});

var logger = log4js.getLogger("Mailer");

logger.info("Starting application");

try {
  // CODE TO READ APP CONFIG FILE
}
catch(e) {
  logger.error("Couldn't read app configuration file (config.yml)");

  // This is the trouble maker. It kills the app without flushing the logs
  process.exit(1);
}

Когда я запускаю приложение, журналы выглядят так:

[2019-07-29T16:07:24.763] [INFO] Mailer - Starting application

Проблема в том, что я вижу сообщения в консоли, но файл журнала остается пустым. Если я удалю его и снова запущу приложение, оно будет создано, поэтому я предполагаю, что проблема в отсутствующей опции или что-то в этом роде.

Любое предложение?


person Fel    schedule 29.07.2019    source источник
comment
Я использовал ваш код дословно, и он отлично записывает в файл. Убедитесь, что он не открыт в другом месте и т.п.   -  person Chris G    schedule 29.07.2019
comment
Я нашел причину проблемы: после того, как я распечатал сообщение об ошибке, я вышел из приложения, запустив process.exit(1);, и кажется, что логгер не сбрасывает сообщения в файл. Я провожу небольшое исследование и опубликую решение, когда найду его.   -  person Fel    schedule 29.07.2019
comment
Да, я предполагаю, что регистратор пишет асинхронно, поэтому, когда вы завершаете процесс сразу после записи чего-либо, он, вероятно, не сохраняется. Вы должны добавить это в код в своем вопросе, чтобы мы могли воспроизвести это.   -  person Chris G    schedule 29.07.2019


Ответы (2)


Чтобы избежать изменения логики приложения и всех вызовов process.exit(), я заменил приложение file его синхронной версией fileSync, и теперь все работает как положено. Итак, единственное, что я изменил, это строка, в которой я объявляю приложение «файл»:

    'file': { type: 'fileSync', filename: 'logs/mailer.log' }

Ваше здоровье!

person Fel    schedule 30.07.2019
comment
работает как шарм, я все еще путаюсь с асинхронным программированием - person Bigyan Devkota; 18.07.2021

Вы можете использовать loggerWinston... Я использовал его в своем приложении nodejs, и он отлично работает.
Вы должны добавить его в ваш server.js (файл, который вы используете для запуска узла)

const winston = require('winston');

const tsFormat = () => (new Date()).toLocaleTimeString();
global.loggerWinston = new (winston.Logger)({
  transports: [
    // colorize the output to the console
    new (winston.transports.Console)({
      timestamp: tsFormat,
      colorize: true,
      level: 'debug'
    }),
    new (winston.transports.File)({
      filename: 'results.log',
      timestamp: tsFormat,
//      level: (process.env.NODE_ENV || 'development') === 'development' ? 'debug' : 'info'
      level: 'info'
    })
  ]
});

Файл results.log должен быть добавлен в папку вашего проекта.

Это ссылка https://www.npmjs.com/package/winston< /а>

person alesssz    schedule 29.07.2019
comment
Спасибо за предложение, я не знал эту библиотеку, я посмотрю, чтобы увидеть ее возможности. - person Fel; 29.07.2019
comment
@Fel Конечно, дайте мне знать, если это работает так, как вы этого хотите :) - person alesssz; 29.07.2019