pull #21: some style tweaks, add stream to error event args, test case, example, changelog
This commit is contained in:
parent
63711a654a
commit
858150bbd2
4 changed files with 80 additions and 7 deletions
11
CHANGES.md
11
CHANGES.md
|
@ -1,6 +1,15 @@
|
||||||
# bunyan Changelog
|
# bunyan Changelog
|
||||||
|
|
||||||
## bunyan 0.7.1 (not yet released)
|
## bunyan 0.8.0 (not yet released)
|
||||||
|
|
||||||
|
- [pull #21] Bunyan loggers now re-emit `fs.createWriteStream` error events.
|
||||||
|
By github.com/EvanOxfeld. See "examples/handle-fs-error.js" and
|
||||||
|
"test/error-event.js" for details.
|
||||||
|
|
||||||
|
var log = new Logger({name: 'mylog', streams: [{path: FILENAME}]});
|
||||||
|
log.on('error', function (err, stream) {
|
||||||
|
// Handle error writing to or creating FILENAME.
|
||||||
|
});
|
||||||
|
|
||||||
- jsstyle'ing (via `make check`)
|
- jsstyle'ing (via `make check`)
|
||||||
|
|
||||||
|
|
37
examples/handle-fs-error.js
Normal file
37
examples/handle-fs-error.js
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
// Example handling as fs error for a Bunyan-created
|
||||||
|
// stream.
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var Logger = require('../lib/bunyan');
|
||||||
|
|
||||||
|
var FILENAME = 'handle-fs-error.log';
|
||||||
|
var S_IWUSR = 00200; // mask for owner write permission in stat mode
|
||||||
|
|
||||||
|
console.warn('- Log file is "%s".', FILENAME);
|
||||||
|
if (!path.existsSync(FILENAME)) {
|
||||||
|
console.warn('- Touch log file.');
|
||||||
|
fs.writeFileSync(FILENAME, 'touch\n');
|
||||||
|
}
|
||||||
|
if (fs.statSync(FILENAME).mode & S_IWUSR) {
|
||||||
|
console.warn('- Make log file read-only.');
|
||||||
|
fs.chmodSync(FILENAME, 0444);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.warn('- Create logger.')
|
||||||
|
var log = new Logger({name: 'handle-fs-error', streams: [{path: FILENAME}]});
|
||||||
|
|
||||||
|
log.on('error', function (err) {
|
||||||
|
console.warn('- The logger emitted an error:', err);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.warn('- Call log.info(...).')
|
||||||
|
log.info('info log message');
|
||||||
|
console.warn('- Called log.info(...).')
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
console.warn('- Call log.warn(...).')
|
||||||
|
log.warn('warn log message');
|
||||||
|
console.warn('- Called log.warn(...).')
|
||||||
|
}, 1000);
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* The bunyan logging library for node.js.
|
* The bunyan logging library for node.js.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var VERSION = '0.7.1';
|
var VERSION = '0.8.0';
|
||||||
|
|
||||||
// Bunyan log format version. This becomes the 'v' field on all log records.
|
// Bunyan log format version. This becomes the 'v' field on all log records.
|
||||||
// `0` is until I release a version '1.0.0' of node-bunyan. Thereafter,
|
// `0` is until I release a version '1.0.0' of node-bunyan. Thereafter,
|
||||||
|
@ -170,8 +170,6 @@ function resolveLevel(nameOrNum) {
|
||||||
|
|
||||||
//---- Logger class
|
//---- Logger class
|
||||||
|
|
||||||
Logger.prototype = new EventEmitter;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a Logger instance.
|
* Create a Logger instance.
|
||||||
*
|
*
|
||||||
|
@ -242,6 +240,8 @@ function Logger(options, _childOptions, _childSimple) {
|
||||||
throw new TypeError('invalid options.serializers: must be an object')
|
throw new TypeError('invalid options.serializers: must be an object')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventEmitter.call(this);
|
||||||
|
|
||||||
// Fast path for simple child creation.
|
// Fast path for simple child creation.
|
||||||
if (parent && _childSimple) {
|
if (parent && _childSimple) {
|
||||||
// `_isSimpleChild` is a signal to stream close handling that this child
|
// `_isSimpleChild` is a signal to stream close handling that this child
|
||||||
|
@ -319,9 +319,10 @@ function Logger(options, _childOptions, _childSimple) {
|
||||||
case 'file':
|
case 'file':
|
||||||
if (!s.stream) {
|
if (!s.stream) {
|
||||||
s.stream = fs.createWriteStream(s.path,
|
s.stream = fs.createWriteStream(s.path,
|
||||||
{flags: 'a', encoding: 'utf8'}).on('error', function(err) {
|
{flags: 'a', encoding: 'utf8'});
|
||||||
self.emit('error', err);
|
s.stream.on('error', function (err) {
|
||||||
});
|
self.emit('error', err, s);
|
||||||
|
});
|
||||||
if (!s.closeOnExit) {
|
if (!s.closeOnExit) {
|
||||||
s.closeOnExit = true;
|
s.closeOnExit = true;
|
||||||
}
|
}
|
||||||
|
@ -404,6 +405,8 @@ function Logger(options, _childOptions, _childSimple) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
util.inherits(Logger, EventEmitter);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a child logger, typically to add a few log record fields.
|
* Create a child logger, typically to add a few log record fields.
|
||||||
|
|
24
test/error-event.test.js
Normal file
24
test/error-event.test.js
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012 Trent Mick. All rights reserved.
|
||||||
|
*
|
||||||
|
* Test emission and handling of 'error' event in a logger with a 'path'
|
||||||
|
* stream.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var test = require('tap').test;
|
||||||
|
var Logger = require('../lib/bunyan');
|
||||||
|
|
||||||
|
test('error event on log write', function (t) {
|
||||||
|
LOG_PATH = '/this/path/is/bogus.log'
|
||||||
|
var log = new Logger({name: 'error-event', streams: [{path: LOG_PATH}]});
|
||||||
|
t.plan(5);
|
||||||
|
log.on('error', function (err, stream) {
|
||||||
|
t.ok(err, 'got err in error event: ' + err);
|
||||||
|
t.equal(err.code, 'ENOENT', 'error code is ENOENT');
|
||||||
|
t.ok(stream, 'got a stream argument');
|
||||||
|
t.equal(stream.path, LOG_PATH);
|
||||||
|
t.equal(stream.type, 'file');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
log.info('info log message');
|
||||||
|
});
|
Loading…
Reference in a new issue