A port of log4js to node.js
You’ll need to use the logLevelFilter. Here’s an example configuration:
log4js.configure({
appenders: {
everything: { type: "file", filename: "all-the-logs.log" },
emergencies: { type: "file", filename: "oh-no-not-again.log" },
"just-errors": {
type: "logLevelFilter",
appender: "emergencies",
level: "error",
},
},
categories: {
default: { appenders: ["just-errors", "everything"], level: "debug" },
},
});
const logger = log4js.getLogger();
logger.debug("This goes to all-the-logs.log");
logger.info("As does this.");
logger.error("This goes to all-the-logs.log and oh-no-not-again.log");
Previous versions of log4js used to watch for changes in the configuration file and reload when it changed. It didn’t always work well, sometimes leaving file handles or sockets open. This feature was removed in version 2.x. As a replacement, I’d suggest using a library like watchr to notify you of file changes. Then you can call log4js.shutdown
followed by log4js.configure
again.
replaceConsole
- it doesn’t work any more?I removed replaceConsole
- it caused a few weird errors, and I wasn’t entirely comfortable with messing around with a core part of node. If you still want to do this, then code like this should do the trick:
log4js.configure(...); // set up your categories and appenders
const logger = log4js.getLogger('console');
console.log = logger.info.bind(logger); // do the same for others - console.debug, etc.
Take a look at the clustering docs, they should help you out.
Nodemailer version 4.0.1 (the not-deprecated version) requires a node version >= 6, but log4js supports node versions >= 4. So until I stop supporting node versions less than 6 I can’t update the dependency. It’s only an optional dependency anyway, so you’re free to install nodemailer@4.0.1 if you want - as far as I know it should work, the API looks the same to me. If you know that the smtp appender definitely doesn’t work with nodemailer v4, then please create an issue with some details about the problem.
You need to enable call stack for the category, and use pattern layout to output the values. e.g.
const log4js = require("log4js");
log4js.configure({
appenders: {
out: {
type: "stdout",
layout: {
type: "pattern",
pattern: "%d %p %c %f:%l %m%n",
},
},
},
categories: {
default: { appenders: ["out"], level: "info", enableCallStack: true },
},
});
const logger = log4js.getLogger("thing");
logger.info("this should give me a line number now");
Would output something like this:
2019-05-22T08:41:07.312 INFO thing index.js:16 this should give me a line number now