A port of log4js to node.js
This is a file appender that rolls log files based on a configurable time, rather than the file size. When using the date file appender, you should also call log4js.shutdown
when your application terminates, to ensure that any remaining asynchronous writes have finished. Although the date file appender uses the streamroller library, this is included as a dependency of log4js so you do not need to include it yourself.
type
- "dateFile"
filename
- string
- the path of the file where you want your logs written.pattern
- string
(optional, defaults to yyyy-MM-dd
) - the pattern to use to determine when to roll the logs.layout
- (optional, defaults to basic layout) - see layoutsAny other configuration parameters will be passed to the underlying streamroller implementation (see also node.js core file streams):
encoding
- string
(default “utf-8”)mode
- integer
(default 0o600 - node.js file modes)flags
- string
(default ‘a’ - node.js file flags)compress
- boolean
(default false) - compress the backup files using gzip (backup files will have .gz
extension)keepFileExt
- boolean
(default false) - preserve the file extension when rotating log files (file.log
becomes file.2017-05-30.log
instead of file.log.2017-05-30
).fileNameSep
- string
(default ‘.’) - the filename separator when rolling. e.g.: abc.log.
2013-08-30 or abc.
2013-08-30.log (keepFileExt)alwaysIncludePattern
- boolean
(default false) - include the pattern in the name of the current log file.numBackups
- integer
(default 1) - the number of old files that matches the pattern to keep (excluding the hot file).The pattern
is used to determine when the current log file should be renamed and a new log file created. For example, with a filename of ‘cheese.log’, and the default pattern of .yyyy-MM-dd
- on startup this will result in a file called cheese.log
being created and written to until the next write after midnight. When this happens, cheese.log
will be renamed to cheese.log.2017-04-30
and a new cheese.log
file created. The appender uses the date-format library to parse the pattern
, and any of the valid formats can be used. Also note that there is no timer controlling the log rolling - changes in the pattern are determined on every log write. If no writes occur, then no log rolling will happen. If your application logs infrequently this could result in no log file being written for a particular time period.
Note that, from version 4.x of log4js onwards, the file appender can take any of the options for the file appender as well. So you could roll files by both date and size.
log4js.configure({
appenders: {
everything: { type: "dateFile", filename: "all-the-logs.log" },
},
categories: {
default: { appenders: ["everything"], level: "debug" },
},
});
This example will result in files being rolled every day. The initial file will be all-the-logs.log
, with the daily backups being all-the-logs.log.2017-04-30
, etc.
log4js.configure({
appenders: {
everything: {
type: "dateFile",
filename: "all-the-logs.log",
pattern: "yyyy-MM-dd-hh",
compress: true,
},
},
categories: {
default: { appenders: ["everything"], level: "debug" },
},
});
This will result in one current log file (all-the-logs.log
). Every hour this file will be compressed and renamed to all-the-logs.log.2017-04-30-08.gz
(for example) and a new all-the-logs.log
created.
If your application logs a large volume of messages, and find memory usage increasing due to buffering log messages before being written to a file, then you can listen for “log4js:pause” events emitted by the file appenders. Your application should stop logging when it receives one of these events with a value of true
and resume when it receives an event with a value of false
.
log4js.configure({
appenders: {
output: { type: "dateFile", filename: "out.log" },
},
categories: { default: { appenders: ["output"], level: "debug" } },
});
let paused = false;
process.on("log4js:pause", (value) => (paused = value));
const logger = log4js.getLogger();
while (!paused) {
logger.info("I'm logging, but I will stop once we start buffering");
}