2010-01-17 09:08:28 +08:00
# log4js-node
2011-09-15 06:13:04 +08:00
NOTE: v0.3.8 of log4js is the last that will work with node versions older than 0.4. To use v0.3.9 you will need node 0.4 or later.
2011-10-27 10:12:36 +08:00
This is a conversion of the [log4js ](http://log4js.berlios.de/index.html )
2010-01-17 09:08:28 +08:00
framework to work with [node ](http://nodejs.org ). I've mainly stripped out the browser-specific code
2011-10-27 10:12:36 +08:00
and tidied up some of the javascript. It includes a basic file logger, with log rolling based on file size, and also replaces node's console.log functions.
2011-04-17 15:48:51 +08:00
2011-07-15 07:13:09 +08:00
NOTE: in v0.2.x require('log4js') returned a function, and you needed to call that function in your code before you could use it. This was to make testing easier. v0.3.x make use of [felixge's sandbox-module ](https://github.com/felixge/node-sandboxed-module ), so we don't need to return a function.
2011-04-17 15:48:51 +08:00
2010-08-10 20:02:27 +08:00
## installation
npm install log4js
2010-01-17 09:08:28 +08:00
## tests
2011-10-27 10:12:36 +08:00
Tests now use [vows ](http://vowsjs.org ), run with `vows test/*.js` .
2010-01-17 09:08:28 +08:00
## usage
2010-12-05 07:56:09 +08:00
Minimalist version:
2011-04-17 16:25:00 +08:00
2011-07-13 16:29:53 +08:00
var log4js = require('log4js');
2010-12-05 07:56:09 +08:00
var logger = log4js.getLogger();
logger.debug("Some debug messages");
2011-04-17 16:25:00 +08:00
2010-12-05 14:17:37 +08:00
By default, log4js outputs to stdout with the coloured layout (thanks to [masylum ](http://github.com/masylum )), so for the above you would see:
2011-04-17 16:25:00 +08:00
2010-12-05 07:56:09 +08:00
[2010-01-17 11:43:37.987] [DEBUG] [default] - Some debug messages
2010-01-17 09:08:28 +08:00
See example.js:
2011-07-13 16:29:53 +08:00
var log4js = require('log4js'); //note the need to call the function
2010-03-29 11:59:26 +08:00
log4js.addAppender(log4js.consoleAppender());
log4js.addAppender(log4js.fileAppender('logs/cheese.log'), 'cheese');
2011-10-27 10:12:36 +08:00
2010-01-17 09:26:55 +08:00
var logger = log4js.getLogger('cheese');
logger.setLevel('ERROR');
2011-10-27 10:12:36 +08:00
2010-01-17 09:26:55 +08:00
logger.trace('Entering cheese testing');
logger.debug('Got cheese.');
2011-10-27 10:12:36 +08:00
logger.info('Cheese is Gouda.');
2010-01-17 09:26:55 +08:00
logger.warn('Cheese is quite smelly.');
logger.error('Cheese is too ripe!');
logger.fatal('Cheese was breeding ground for listeria.');
2011-10-27 10:12:36 +08:00
2011-04-17 16:25:00 +08:00
Output:
2010-01-17 09:28:22 +08:00
[2010-01-17 11:43:37.987] [ERROR] cheese - Cheese is too ripe!
[2010-01-17 11:43:37.990] [FATAL] cheese - Cheese was breeding ground for listeria.
2010-01-17 09:08:28 +08:00
2011-10-27 10:12:36 +08:00
2010-01-17 09:08:28 +08:00
## configuration
2011-10-27 10:12:36 +08:00
You can either configure the appenders and log levels manually (as above), or provide a
configuration file (`log4js.configure('path/to/file.json')`) explicitly, or just let log4js look for a file called `log4js.json` (it looks in the current directory first, then the require paths, and finally looks for the default config included in the same directory as the `log4js.js` file).
2011-07-22 12:43:33 +08:00
An example file can be found in `test/log4js.json` . An example config file with log rolling is in `test/with-log-rolling.json` .
By default, the configuration file is checked for changes every 60 seconds, and if changed, reloaded. This allows changes to logging levels
to occur without restarting the application.
2011-07-22 13:59:17 +08:00
To turn off configuration file change checking, configure with:
2011-07-25 11:16:56 +08:00
var log4js = require('log4js');
log4js.configure(undefined, {}); // load 'log4js.json' from NODE_PATH
2011-07-22 13:59:17 +08:00
Or:
2011-07-25 11:16:56 +08:00
log4js.configure('my_log4js_configuration.json', {});
2011-07-22 13:59:17 +08:00
To specify a different period:
2011-07-25 11:16:56 +08:00
log4js.configure(undefined, { reloadSecs: 300 }); // load 'log4js.json' from NODE_PATH
2011-07-22 13:59:17 +08:00
2011-01-16 10:24:07 +08:00
You can also pass an object to the configure function, which has the same properties as the json versions.
2010-01-17 09:08:28 +08:00
2011-04-07 08:19:18 +08:00
## connect/express logger
2011-10-27 10:12:36 +08:00
A connect/express logger has been added to log4js, by [danbell ](https://github.com/danbell ). This allows connect/express servers to log using log4js. See example-connect-logger.js.
2011-04-07 08:19:18 +08:00
2011-07-13 16:29:53 +08:00
var log4js = require('./lib/log4js');
2011-04-07 08:19:18 +08:00
log4js.addAppender(log4js.consoleAppender());
log4js.addAppender(log4js.fileAppender('cheese.log'), 'cheese');
2011-10-27 10:12:36 +08:00
2011-04-07 08:19:18 +08:00
var logger = log4js.getLogger('cheese');
2011-10-27 10:12:36 +08:00
2011-04-07 08:19:18 +08:00
logger.setLevel('INFO');
2011-10-27 10:12:36 +08:00
2011-04-07 08:19:18 +08:00
var app = require('express').createServer();
app.configure(function() {
app.use(log4js.connectLogger(logger, { level: log4js.levels.INFO }));
});
app.get('/', function(req,res) {
res.send('hello world');
});
app.listen(5000);
The options object that is passed to log4js.connectLogger supports a format string the same as the connect/express logger. For example:
app.configure(function() {
app.use(log4js.connectLogger(logger, { level: log4js.levels.INFO, format: ':method :url' }));
});
2011-10-27 10:12:36 +08:00
## hook.io logger
2011-10-27 10:13:22 +08:00
A [hook.io ](https://github.com/hookio ) logger has been added to log4js by [dbrain ](https://github.com/dbrain ). This allows multiple worker processes to log through a single master process, avoiding issues with rolling etc. in a clustered environment.
2011-10-27 10:12:36 +08:00
This was mainly created for [cluster ](https://github.com/LearnBoost/cluster ), but you can adapt the example to match your needs, you know, if it fits them.
< pre >
#### log4js-master.json ####
{
"appenders": [{
"type": "logLevelFilter",
"level": "DEBUG",
"appender": {
"type": "hookio",
"name": "hookio-logger",
"mode": "master",
"debug": false,
"appender": {
"type": "file",
"filename": "muffin.log",
"maxLogSize": 104857600,
"backups": 10,
"pollInterval": 15
}
}
}]
}
2011-10-27 10:14:29 +08:00
2011-10-27 10:12:36 +08:00
#### log4js-worker.json ####
{
"appenders": [{
"type": "logLevelFilter",
"level": "DEBUG",
"appender": {
"type": "hookio",
"name": "hookio-logger",
"mode": "worker",
"debug": false
}
}]
}
2011-10-27 10:14:29 +08:00
2011-10-27 10:12:36 +08:00
#### ilikebeans.js ####
var cluster = require('cluster');
var hookCluster = cluster('./doyoulikebeans');
// Perform the once off configuration depending on type of cluster
2011-10-27 10:14:10 +08:00
if (hookCluster.isMaster) {
2011-10-27 10:12:36 +08:00
require('log4js').configure('log4js-master.json');
} else {
require('log4js').configure('log4js-worker.json');
}
// Standard cluster startup
hookCluster
.use(cluster.logger('run/logs'))
.use(cluster.pidfiles('run/pids'))
.listen(3000);
< / pre >
2011-10-28 07:07:48 +08:00
log4js-master/worker.json hookio appender parameters will be passed into the Hook constructor directly, so you can specify hook-port, hook-host etc.
2011-10-27 10:16:42 +08:00
*NOTE* hook.io appender will currently (and probably indefinitely) explode if you enable hook.io debug because of the way log4js overrides console.log
2011-10-27 10:12:36 +08:00
2010-01-17 09:08:28 +08:00
## author (of this node version)
Gareth Jones (csausdev - gareth.jones@sensis.com.au)
## License
The original log4js was distributed under the Apache 2.0 License, and so is this. I've tried to
2011-10-27 10:12:36 +08:00
keep the original copyright and author credits in place, except in sections that I have rewritten
2010-01-17 09:08:28 +08:00
extensively.