Compare commits
6 Commits
node-0.8-r
...
isaacg-alw
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
936ad4da8e | ||
|
|
097ae3d7f1 | ||
|
|
04de4ed8d3 | ||
|
|
29b02921b6 | ||
|
|
48ed5d1222 | ||
|
|
7844b0d2e4 |
@@ -17,8 +17,6 @@ Out of the box it supports the following features:
|
|||||||
* configurable log message layout/patterns
|
* configurable log message layout/patterns
|
||||||
* different log levels for different log categories (make some parts of your app log as DEBUG, others only ERRORS, etc.)
|
* different log levels for different log categories (make some parts of your app log as DEBUG, others only ERRORS, etc.)
|
||||||
|
|
||||||
NOTE: version 0.6.0 onwards will only work with node v0.10.x upwards, since it makes use of the new streams API. If you're using node 0.8 or lower, use log4js@0.5.7.
|
|
||||||
|
|
||||||
NOTE: from log4js 0.5 onwards you'll need to explicitly enable replacement of node's console.log functions. Do this either by calling `log4js.replaceConsole()` or configuring with an object or json file like this:
|
NOTE: from log4js 0.5 onwards you'll need to explicitly enable replacement of node's console.log functions. Do this either by calling `log4js.replaceConsole()` or configuring with an object or json file like this:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ process.on('exit', function() {
|
|||||||
* also used to check when to roll files - defaults to '.yyyy-MM-dd'
|
* also used to check when to roll files - defaults to '.yyyy-MM-dd'
|
||||||
* @layout layout function for log messages - defaults to basicLayout
|
* @layout layout function for log messages - defaults to basicLayout
|
||||||
*/
|
*/
|
||||||
function appender(filename, pattern, layout) {
|
function appender(filename, pattern, alwaysIncludePattern, layout) {
|
||||||
layout = layout || layouts.basicLayout;
|
layout = layout || layouts.basicLayout;
|
||||||
|
|
||||||
var logFile = new streams.DateRollingFileStream(filename, pattern);
|
var logFile = new streams.DateRollingFileStream(filename, pattern, { alwaysIncludePattern: alwaysIncludePattern });
|
||||||
openFiles.push(logFile);
|
openFiles.push(logFile);
|
||||||
|
|
||||||
return function(logEvent) {
|
return function(logEvent) {
|
||||||
@@ -35,14 +35,18 @@ function configure(config, options) {
|
|||||||
var layout;
|
var layout;
|
||||||
|
|
||||||
if (config.layout) {
|
if (config.layout) {
|
||||||
layout = layouts.layout(config.layout.type, config.layout);
|
layout = layouts.layout(config.layout.type, config.layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.alwaysIncludePattern) {
|
||||||
|
config.alwaysIncludePattern = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options && options.cwd && !config.absolute) {
|
if (options && options.cwd && !config.absolute) {
|
||||||
config.filename = path.join(options.cwd, config.filename);
|
config.filename = path.join(options.cwd, config.filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
return appender(config.filename, config.pattern, layout);
|
return appender(config.filename, config.pattern, config.alwaysIncludePattern, layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.appender = appender;
|
exports.appender = appender;
|
||||||
|
|||||||
@@ -14,18 +14,29 @@ if (process.env.NODE_DEBUG && /\blog4js\b/.test(process.env.NODE_DEBUG)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function DateRollingFileStream(filename, pattern, options, now) {
|
function DateRollingFileStream(filename, pattern, options, now) {
|
||||||
debug("Now is " + now);
|
debug("Now is " + now);
|
||||||
if (pattern && typeof(pattern) === 'object') {
|
if (pattern && typeof(pattern) === 'object') {
|
||||||
now = options;
|
now = options;
|
||||||
options = pattern;
|
options = pattern;
|
||||||
pattern = null;
|
pattern = null;
|
||||||
}
|
}
|
||||||
this.pattern = pattern || '.yyyy-MM-dd';
|
this.pattern = pattern || '.yyyy-MM-dd';
|
||||||
this.now = now || Date.now;
|
this.now = now || Date.now;
|
||||||
this.lastTimeWeWroteSomething = format.asString(this.pattern, new Date(this.now()));
|
this.lastTimeWeWroteSomething = format.asString(this.pattern, new Date(this.now()));
|
||||||
debug("this.now is " + this.now + ", now is " + now);
|
this.baseFilename = filename;
|
||||||
|
|
||||||
DateRollingFileStream.super_.call(this, filename, options);
|
if (options) {
|
||||||
|
if (options.alwaysIncludePattern) {
|
||||||
|
filename = filename + this.lastTimeWeWroteSomething;
|
||||||
|
}
|
||||||
|
delete options.alwaysIncludePattern;
|
||||||
|
if (options === {}) {
|
||||||
|
options = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debug("this.now is " + this.now + ", now is " + now);
|
||||||
|
|
||||||
|
DateRollingFileStream.super_.call(this, filename, options);
|
||||||
}
|
}
|
||||||
util.inherits(DateRollingFileStream, BaseRollingFileStream);
|
util.inherits(DateRollingFileStream, BaseRollingFileStream);
|
||||||
|
|
||||||
@@ -43,7 +54,7 @@ DateRollingFileStream.prototype.shouldRoll = function() {
|
|||||||
|
|
||||||
DateRollingFileStream.prototype.roll = function(filename, callback) {
|
DateRollingFileStream.prototype.roll = function(filename, callback) {
|
||||||
var that = this,
|
var that = this,
|
||||||
newFilename = filename + this.previousTime;
|
newFilename = this.baseFilename + this.previousTime;
|
||||||
|
|
||||||
debug("Starting roll");
|
debug("Starting roll");
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "log4js",
|
"name": "log4js",
|
||||||
"version": "0.6.2",
|
"version": "0.6.3",
|
||||||
"description": "Port of Log4js to work with node.",
|
"description": "Port of Log4js to work with node.",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"logging",
|
"logging",
|
||||||
|
|||||||
@@ -72,27 +72,58 @@ vows.describe('../lib/appenders/dateFile').addBatch({
|
|||||||
|
|
||||||
}
|
}
|
||||||
}).addBatch({
|
}).addBatch({
|
||||||
'configure': {
|
'configure': {
|
||||||
'with dateFileAppender': {
|
'with dateFileAppender': {
|
||||||
topic: function() {
|
topic: function() {
|
||||||
var log4js = require('../lib/log4js')
|
var log4js = require('../lib/log4js')
|
||||||
, logger;
|
, logger;
|
||||||
//this config file defines one file appender (to ./date-file-test.log)
|
//this config file defines one file appender (to ./date-file-test.log)
|
||||||
//and sets the log level for "tests" to WARN
|
//and sets the log level for "tests" to WARN
|
||||||
log4js.configure('test/with-dateFile.json');
|
log4js.configure('test/with-dateFile.json');
|
||||||
logger = log4js.getLogger('tests');
|
logger = log4js.getLogger('tests');
|
||||||
logger.info('this should not be written to the file');
|
logger.info('this should not be written to the file');
|
||||||
logger.warn('this should be written to the file');
|
logger.warn('this should be written to the file');
|
||||||
|
|
||||||
fs.readFile(path.join(__dirname, 'date-file-test.log'), 'utf8', this.callback);
|
fs.readFile(path.join(__dirname, 'date-file-test.log'), 'utf8', this.callback);
|
||||||
},
|
},
|
||||||
teardown: removeFile('date-file-test.log'),
|
teardown: removeFile('date-file-test.log'),
|
||||||
|
|
||||||
'should load appender configuration from a json file': function(err, contents) {
|
'should load appender configuration from a json file': function(err, contents) {
|
||||||
assert.include(contents, 'this should be written to the file\n');
|
assert.include(contents, 'this should be written to the file' + require('os').EOL);
|
||||||
assert.equal(contents.indexOf('this should not be written to the file'), -1);
|
assert.equal(contents.indexOf('this should not be written to the file'), -1);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
'with options.alwaysIncludePattern': {
|
||||||
|
topic: function() {
|
||||||
|
var log4js = require('../lib/log4js')
|
||||||
|
, format = require('../lib/date_format')
|
||||||
|
, logger
|
||||||
|
, options = {
|
||||||
|
"appenders": [
|
||||||
|
{
|
||||||
|
"category": "tests",
|
||||||
|
"type": "dateFile",
|
||||||
|
"filename": "test/date-file-test",
|
||||||
|
"pattern": "-from-MM-dd.log",
|
||||||
|
"alwaysIncludePattern": true,
|
||||||
|
"layout": {
|
||||||
|
"type": "messagePassThrough"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
, thisTime = format.asString(options.appenders[0].pattern, new Date());
|
||||||
|
log4js.clearAppenders();
|
||||||
|
log4js.configure(options);
|
||||||
|
logger = log4js.getLogger('tests');
|
||||||
|
logger.warn('this should be written to the file with the appended date');
|
||||||
|
this.teardown = removeFile('date-file-test' + thisTime);
|
||||||
|
fs.readFile(path.join(__dirname, 'date-file-test' + thisTime), 'utf8', this.callback);
|
||||||
|
},
|
||||||
|
'should create file with the correct pattern': function(contents) {
|
||||||
|
assert.include(contents, 'this should be written to the file with the appended date');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}).exportTo(module);
|
}).exportTo(module);
|
||||||
|
|||||||
@@ -76,8 +76,8 @@ vows.describe('DateRollingFileStream').addBatch({
|
|||||||
var that = this,
|
var that = this,
|
||||||
stream = new DateRollingFileStream(__dirname + '/test-date-rolling-file-stream-5', '.yyyy-MM-dd', null, now);
|
stream = new DateRollingFileStream(__dirname + '/test-date-rolling-file-stream-5', '.yyyy-MM-dd', null, now);
|
||||||
stream.write("First message\n", 'utf8', function() {
|
stream.write("First message\n", 'utf8', function() {
|
||||||
that.callback(null, stream);
|
that.callback(null, stream);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
teardown: cleanUp(__dirname + '/test-date-rolling-file-stream-5'),
|
teardown: cleanUp(__dirname + '/test-date-rolling-file-stream-5'),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user