Compare commits

...

20 Commits

Author SHA1 Message Date
Gareth Jones
936ad4da8e fixed tests broken by alwaysIncludePattern 2013-05-05 13:44:01 +10:00
Gareth Jones
097ae3d7f1 Merge branch 'alwaysIncludePattern' of https://github.com/issacg/log4js-node into isaacg-alwaysIncludePattern 2013-05-04 16:10:02 +10:00
Issac Goldstand
04de4ed8d3 fix OS-specific endline mucking test results (:-O not everyone uses linux?!?!) 2013-05-03 11:14:28 +03:00
Issac Goldstand
29b02921b6 add option alwaysIncludePattern to dateTime appender to always use the filename with the pattern included when logging 2013-05-02 14:56:33 +03:00
Gareth Jones
48ed5d1222 Removed the warning about node 0.10 2013-04-11 22:34:49 +10:00
Gareth Jones
7844b0d2e4 0.6.3 2013-04-11 22:29:13 +10:00
Gareth Jones
8b49ba9f3d added node 0.8 to travis config and package.json 2013-04-11 21:49:08 +10:00
Gareth Jones
ed7462885f backporting new streams to node 0.8 for issue #129 2013-04-11 21:45:16 +10:00
Gareth Jones
36c5175a55 0.6.2 2013-04-02 12:02:47 +11:00
Gareth Jones
22160f90b3 fixed the multiprocess tests 2013-04-02 11:59:45 +11:00
Gareth Jones
73437ecb40 Merge branch 'master' of https://github.com/dsn/log4js-node into dsn-master 2013-04-02 11:34:25 +11:00
Gareth Jones
107e33c0d1 merged in change from @vojtajina for pull request #128 2013-04-02 10:18:25 +11:00
Gareth Jones
6352632fb2 fix version of node supported 2013-04-02 10:02:48 +11:00
Gareth Jones
0544342e9f Merge pull request #128 from Dignifiedquire/master-engine
Fix node engine in package.json
2013-04-01 15:42:41 -07:00
Friedel Ziegelmayer
1d1153d32f Fix node engine in package.json 2013-04-01 23:00:26 +02:00
Gary Steven
e58cf201ca Updated for Node 0.10.x
net.createServer no longer emits 'connect' event
2013-03-30 03:23:58 -07:00
Gareth Jones
83271e47fc Merge pull request #125 from jimschubert/master
Allow for somewhat standard debugging calls
2013-03-24 19:35:24 -07:00
Jim Schubert
f3271a3997 Add standard debug conditional function
: master
2013-03-23 18:50:13 -07:00
Gareth Jones
4b7cf589a2 Fixing the wiki links (issue #124) 2013-03-20 19:47:32 +11:00
Gareth Jones
c8f401c47d fixed travis node version format 2013-03-20 14:58:56 +11:00
12 changed files with 208 additions and 129 deletions

View File

@@ -1,3 +1,5 @@
language: node_js language: node_js
node_js: node_js:
- 0.10 - "0.10"
- "0.8"

View File

@@ -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
@@ -130,13 +128,13 @@ If you have already defined an absolute path for one of the FileAppenders in the
] ]
} }
``` ```
Documentation for most of the core appenders can be found on the [wiki](log4js-node/wiki/Appenders), otherwise take a look at the tests and the examples. Documentation for most of the core appenders can be found on the [wiki](https://github.com/nomiddlename/log4js-node/wiki/Appenders), otherwise take a look at the tests and the examples.
## Documentation ## Documentation
See the [wiki](log4js-node/wiki). Improve the [wiki](log4js-node/wiki), please. See the [wiki](https://github.com/nomiddlename/log4js-node/wiki). Improve the [wiki](https://github.com/nomiddlename/log4js-node/wiki), please.
## Contributing ## Contributing
Contributions welcome, but take a look at the [rules](log4js-node/wiki/Contributing) first. Contributions welcome, but take a look at the [rules](https://github.com/nomiddlename/log4js-node/wiki/Contributing) first.
## License ## License

View File

@@ -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;

View File

@@ -38,31 +38,30 @@ function logServer(config) {
var actualAppender = config.actualAppender, var actualAppender = config.actualAppender,
server = net.createServer(function serverCreated(clientSocket) { server = net.createServer(function serverCreated(clientSocket) {
clientSocket.setEncoding('utf8'); clientSocket.setEncoding('utf8');
clientSocket.on('connect', function clientConnected() { var logMessage = '';
var logMessage = '';
function logTheMessage(msg) { function logTheMessage(msg) {
if (logMessage.length > 0) { if (logMessage.length > 0) {
actualAppender(deserializeLoggingEvent(clientSocket, msg)); actualAppender(deserializeLoggingEvent(clientSocket, msg));
}
} }
}
function chunkReceived(chunk) { function chunkReceived(chunk) {
var event; var event;
logMessage += chunk || ''; logMessage += chunk || '';
if (logMessage.indexOf(END_MSG) > -1) { if (logMessage.indexOf(END_MSG) > -1) {
event = logMessage.substring(0, logMessage.indexOf(END_MSG)); event = logMessage.substring(0, logMessage.indexOf(END_MSG));
logTheMessage(event); logTheMessage(event);
logMessage = logMessage.substring(event.length + END_MSG.length) || ''; logMessage = logMessage.substring(event.length + END_MSG.length) || '';
//check for more, maybe it was a big chunk //check for more, maybe it was a big chunk
chunkReceived(); chunkReceived();
}
} }
}
clientSocket.on('data', chunkReceived); clientSocket.on('data', chunkReceived);
clientSocket.on('end', chunkReceived); clientSocket.on('end', chunkReceived);
});
}); });
server.listen(config.loggerPort || 5000, config.loggerHost || 'localhost'); server.listen(config.loggerPort || 5000, config.loggerHost || 'localhost');
return actualAppender; return actualAppender;

View File

@@ -1,9 +1,19 @@
var fs = require('fs'), var fs = require('fs'),
stream = require('stream'), stream,
util = require('util'); util = require('util'),
semver = require('semver');
function debug(message) { if (semver.satisfies(process.version, '>=0.10.0')) {
// console.log(message); stream = require('stream');
} else {
stream = require('readable-stream');
}
var debug;
if (process.env.NODE_DEBUG && /\blog4js\b/.test(process.env.NODE_DEBUG)) {
debug = function(message) { console.error('LOG4JS: (BaseRollingFileStream) %s', message); };
} else {
debug = function() { };
} }
module.exports = BaseRollingFileStream; module.exports = BaseRollingFileStream;
@@ -66,7 +76,7 @@ BaseRollingFileStream.prototype.openTheStream = function(cb) {
BaseRollingFileStream.prototype.closeTheStream = function(cb) { BaseRollingFileStream.prototype.closeTheStream = function(cb) {
debug("closing the underlying stream"); debug("closing the underlying stream");
this.theStream.end(null, null, cb); this.theStream.end(cb);
}; };
BaseRollingFileStream.prototype.shouldRoll = function() { BaseRollingFileStream.prototype.shouldRoll = function() {

View File

@@ -6,23 +6,37 @@ var BaseRollingFileStream = require('./BaseRollingFileStream'),
module.exports = DateRollingFileStream; module.exports = DateRollingFileStream;
function debug(message) { var debug;
// console.log(message); if (process.env.NODE_DEBUG && /\blog4js\b/.test(process.env.NODE_DEBUG)) {
debug = function(message) { console.error('LOG4JS: (DateRollingFileStream) %s', message); };
} else {
debug = function() { };
} }
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);
@@ -40,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");

View File

@@ -4,9 +4,11 @@ var BaseRollingFileStream = require('./BaseRollingFileStream'),
fs = require('fs'), fs = require('fs'),
async = require('async'); async = require('async');
function debug() { var debug;
// util.debug(message); if (process.env.NODE_DEBUG && /\blog4js\b/.test(process.env.NODE_DEBUG)) {
// console.log.apply(console, arguments); debug = function(message) { console.error('LOG4JS: (RollingFileStream) %s', message); };
} else {
debug = function() { };
} }
module.exports = RollingFileStream; module.exports = RollingFileStream;

View File

@@ -1,38 +1,42 @@
{ {
"name": "log4js", "name": "log4js",
"version": "0.6.0", "version": "0.6.3",
"description": "Port of Log4js to work with node.", "description": "Port of Log4js to work with node.",
"keywords": [ "keywords": [
"logging", "logging",
"log", "log",
"log4j", "log4j",
"node" "node"
], ],
"main": "./lib/log4js", "main": "./lib/log4js",
"author": "Gareth Jones <gareth.jones@sensis.com.au>", "author": "Gareth Jones <gareth.jones@sensis.com.au>",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/nomiddlename/log4js-node.git" "url": "https://github.com/nomiddlename/log4js-node.git"
}, },
"bugs": { "bugs": {
"url": "http://github.com/nomiddlename/log4js-node/issues" "url": "http://github.com/nomiddlename/log4js-node/issues"
}, },
"engines": [ "node >=0.10" ], "engines": {
"scripts": { "node": ">=0.8"
"test": "vows" },
}, "scripts": {
"directories": { "test": "vows"
"test": "test", },
"lib": "lib" "directories": {
}, "test": "test",
"dependencies": { "lib": "lib"
"async": "0.1.15", },
"dequeue": "1.0.3" "dependencies": {
}, "async": "0.1.15",
"devDependencies": { "dequeue": "1.0.3",
"vows": "0.7.0", "semver": "~1.1.4",
"sandboxed-module": "0.1.3", "readable-stream": "~1.0.2"
"hook.io": "0.8.10", },
"underscore": "1.2.1" "devDependencies": {
} "vows": "0.7.0",
"sandboxed-module": "0.1.3",
"hook.io": "0.8.10",
"underscore": "1.2.1"
}
} }

View File

@@ -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);

View File

@@ -30,24 +30,24 @@ function makeFakeNet() {
}; };
}, },
createServer: function(cb) { createServer: function(cb) {
var fakeNet = this; var fakeNet = this;
cb({ cb({
remoteAddress: '1.2.3.4', remoteAddress: '1.2.3.4',
remotePort: '1234', remotePort: '1234',
setEncoding: function(encoding) { setEncoding: function(encoding) {
fakeNet.encoding = encoding; fakeNet.encoding = encoding;
}, },
on: function(event, cb) { on: function(event, cb) {
fakeNet.cbs[event] = cb; fakeNet.cbs[event] = cb;
} }
}); });
return { return {
listen: function(port, host) { listen: function(port, host) {
fakeNet.port = port; fakeNet.port = port;
fakeNet.host = host; fakeNet.host = host;
} }
}; };
} }
}; };
} }
@@ -183,7 +183,6 @@ vows.describe('Multiprocess Appender').addBatch({
topic: function(net) { topic: function(net) {
var logString = JSON.stringify({ level: { level: 10000, levelStr: 'DEBUG' }, data: ['some debug']}) + '__LOG4JS__'; var logString = JSON.stringify({ level: { level: 10000, levelStr: 'DEBUG' }, data: ['some debug']}) + '__LOG4JS__';
net.cbs['connect']();
net.cbs['data'](JSON.stringify({ level: { level: 40000, levelStr: 'ERROR' }, data: ['an error message'] }) + '__LOG4JS__'); net.cbs['data'](JSON.stringify({ level: { level: 40000, levelStr: 'ERROR' }, data: ['an error message'] }) + '__LOG4JS__');
net.cbs['data'](logString.substring(0, 10)); net.cbs['data'](logString.substring(0, 10));
net.cbs['data'](logString.substring(10)); net.cbs['data'](logString.substring(10));

View File

@@ -1,10 +1,18 @@
var vows = require('vows') var vows = require('vows')
, assert = require('assert') , assert = require('assert')
, streams = require('stream')
, fs = require('fs') , fs = require('fs')
, DateRollingFileStream = require('../../lib/streams').DateRollingFileStream , semver = require('semver')
, streams
, DateRollingFileStream
, testTime = new Date(2012, 8, 12, 10, 37, 11); , testTime = new Date(2012, 8, 12, 10, 37, 11);
if (semver.satisfies(process.version, '>=0.10.0')) {
streams = require('stream');
} else {
streams = require('readable-stream');
}
DateRollingFileStream = require('../../lib/streams').DateRollingFileStream
function cleanUp(filename) { function cleanUp(filename) {
return function() { return function() {
fs.unlink(filename); fs.unlink(filename);
@@ -68,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'),

View File

@@ -3,8 +3,16 @@ var vows = require('vows')
, assert = require('assert') , assert = require('assert')
, events = require('events') , events = require('events')
, fs = require('fs') , fs = require('fs')
, streams = require('stream') , semver = require('semver')
, RollingFileStream = require('../../lib/streams').RollingFileStream; , streams
, RollingFileStream;
if (semver.satisfies(process.version, '>=0.10.0')) {
streams = require('stream');
} else {
streams = require('readable-stream');
}
RollingFileStream = require('../../lib/streams').RollingFileStream;
function remove(filename) { function remove(filename) {
try { try {