Estoy tratando de agregar Log4js-Node a un servidor Node.js que se ejecuta en Apache. Aquí está mi código:
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")); });
Cuando ejecuto el script en Node.js en mi computadora y navego a localhost:443/log veo lo que espero, que es esto:
[2020-03-17T22: 50: 43.145] [DEBUG] predeterminado: escuchar solicitudes en el puerto 443
Pero cuando ejecuto el código en un servidor remoto, falla y aparece esto en la página de error (con parte de la ruta reemplazada por mí con "[eliminado]"):
Salida de la aplicación 25925: en el servidor. ([eliminado]/index.js:27:9)
Salida de la aplicación 25925: en Logger. [como depuración] ([eliminado]/12/lib/node_modules/log4js/lib/logger.js:124:10)
Salida de la aplicación 25925: en Logger.log ([eliminado]/12/lib/node_modules/log4js/lib/logger.js:73:12)
Salida de la aplicación 25925: en Logger._log ([eliminado]/12/lib/node_modules/log4js/lib/logger.js:90:16)
Salida de la aplicación 25925: en Object.send ([eliminado]/12/lib/node_modules/log4js/lib/clustering.js:97:15)
Salida de la aplicación 25925: [eliminado]/12/lib/node_modules/log4js/lib/clustering.js:97
Salida de la aplicación 25925: en el objeto. ([eliminado]/12/lib/node_modules/log4js/lib/clustering.js:8:13)
Estoy usando A2 Hosting que usa Apache 2.4.41. Opté por Node.js 12.9.0 y Log4js 6.1.2. El paquete.json debería ser el mismo tanto en mi computadora como en el servidor, y npm install
en ambos.
¿Es solo un problema con Log4js y el servidor, o me he perdido algo en alguna parte?
Esta fue en realidad una solución relativamente simple. La ruta a la que hace referencia el último error en el seguimiento de la pila es un módulo Log4js que implementa la compatibilidad con la agrupación en clústeres a través del módulo "clúster" de Node. La línea "8" a la que se hace referencia es cluster = require("cluster")
. Está envuelto en un bloque try/catch como este:
try { cluster = require("cluster"); //eslint-disable-line } catch (e) { debug("cluster module not present"); disabled = true; }
La instalación de Node.js en mi computadora vino con el módulo "clúster", sin embargo, por lo que sé, el servidor que estoy usando no lo admite. Además, la versión de Node que estoy usando en mi computadora es más nueva que la que estoy usando en el servidor (así que ahora instalé 12.9 en mi máquina). Creo que la versión anterior de Node no se molesta en intentar capturar la excepción e intenta cargar el módulo del clúster, falla y luego arroja el error.
Entonces, la solución simple fue comentar la mayor parte del bloque "try/catch", dejando solo el contenido de "catch" así:
// try { // cluster = require("cluster"); //eslint-disable-line // } catch (e) { debug("cluster module not present"); disabled = true; // }
Si alguien tiene una solución mejor, estoy abierto a sugerencias.
La misma respuesta de @skittleswrapper, gracias, me funcionó. Uso Node.js 14.18.1 con log4js 6.3.0. Pero me pregunto cuál es el 'clúster' de este módulo y si podemos agregarlo a nuestra aplicación de otra manera.