Требуется ли log4 js дополнительный код для работы на сервере Apache? - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь добавить Log4 js -Node на сервер Node.js, работающий на Apache. Вот мой код:

const path = require("path");
const express = require("express");
const log4js = require('log4js');

const app = express();
const logger = log4js.getLogger();
logger.level = "debug";
const port = 443;

log4js.configure({
  appenders: { everything: { type: 'file', filename: 'logs.log', flags: 'w' } },
  categories: { default: { appenders: ['everything'], level: 'ALL' } }
});

const server = app.listen(port, () => {
    logger.debug("listening to requests on port " + port);
});

app.get("/log", (req, res) => {
  res.sendFile(path.join(__dirname + "/logs.log"));
});

Когда я запускаю скрипт на Node.js на моем компьютере и перехожу к localhost: 443 / log, я вижу то, что ожидаю, а именно:

[2020-03-17T22: 50: 43.145] [DEBUG] по умолчанию - прослушивание запросов через порт 443

Но когда я запускаю код на удаленном сервере, он падает, и я получаю это в страница ошибки (часть пути заменена мной на «[удалено]»):

Выход приложения 25925: на сервере. ([удалено] /index.js:27:9)

Выход приложения 25925: в Logger. [как отладка] ([удалено] /12/lib/node_modules/log4js/lib/logger.js:124:10)

Вывод приложения 25925: в Logger.log ([удалено] / 12 / lib / node_modules / log4js / lib / logger. js: 73: 12)

Выход приложения 25925: в Logger._log ([удалено] /12/lib/node_modules/log4js/lib/logger.js: 90: 16)

Выход приложения 25925: в Object.send ([удалено] /12/lib/node_modules/log4js/lib/clustering.js:97:15)

Вывод приложения 25925: [удалено] /12/lib/node_modules/log4js/lib/clustering.js:97

Вывод приложения 25925: в объекте. ([удалено] /12/lib/node_modules/log4js/lib/clustering.js:8:13)

Я использую хостинг A2, который использует Apache 2.4.41. Я выбрал Node.js 12.9.0 и Log4 js 6.1.2. Пакет. json должен быть одинаковым как на моем компьютере, так и на сервере, и я запускаю npm install на обоих.

Это просто проблема с Log4 js и сервером, или я что-то пропустил?

1 Ответ

0 голосов
/ 20 марта 2020

На самом деле это было относительно просто. Путь, на который ссылается последняя ошибка в трассировке стека, представляет собой модуль Log4 js, который реализует поддержку кластеризации через модуль Node "cluster". Ссылочная строка "8" имеет значение cluster = require("cluster"). Он заключен в блок try / catch, например:

try {
  cluster = require("cluster"); //eslint-disable-line
} catch (e) {
  debug("cluster module not present");
  disabled = true;
}

Установка Node.js на мой компьютер шла с модулем «cluster», однако, насколько я могу судить, сервер, на котором я работаю использование не поддерживает это. Кроме того, версия Node, которую я использую на своем компьютере, новее, чем та, которую я использую на сервере (поэтому я установил 12.9 на свою машину). Я полагаю, что старая версия Node не пытается поймать исключение и пытается загрузить модуль кластера, происходит сбой, а затем выдает ошибку.

Так что простым исправлением было закомментировать большую часть " блок try / catch, оставляя только содержимое «catch» следующим образом:

// try {
//   cluster = require("cluster"); //eslint-disable-line
// } catch (e) {
  debug("cluster module not present");
  disabled = true;
// }

Если у кого-то есть исправление получше, я открыт для предложений.

...