pax_global_header00006660000000000000000000000064121674466440014530gustar00rootroot0000000000000052 comment=334b9088f3e7686ba3250d3e123d9440592816f3 npmlog-0.0.4/000077500000000000000000000000001216744664400130255ustar00rootroot00000000000000npmlog-0.0.4/LICENSE000066400000000000000000000024361216744664400140370ustar00rootroot00000000000000Copyright (c) Isaac Z. Schlueter ("Author") All rights reserved. The BSD License Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. npmlog-0.0.4/README.md000066400000000000000000000076001216744664400143070ustar00rootroot00000000000000# npmlog The logger util that npm uses. This logger is very basic. It does the logging for npm. It supports custom levels and colored output. By default, logs are written to stderr. If you want to send log messages to outputs other than streams, then you can change the `log.stream` member, or you can just listen to the events that it emits, and do whatever you want with them. # Basic Usage ``` var log = require('npmlog') // additional stuff ---------------------------+ // message ----------+ | // prefix ----+ | | // level -+ | | | // v v v v log.info('fyi', 'I have a kitty cat: %j', myKittyCat) ``` ## log.level * {String} The level to display logs at. Any logs at or above this level will be displayed. The special level `silent` will prevent anything from being displayed ever. ## log.record * {Array} An array of all the log messages that have been entered. ## log.maxRecordSize * {Number} The maximum number of records to keep. If log.record gets bigger than 10% over this value, then it is sliced down to 90% of this value. The reason for the 10% window is so that it doesn't have to resize a large array on every log entry. ## log.prefixStyle * {Object} A style object that specifies how prefixes are styled. (See below) ## log.headingStyle * {Object} A style object that specifies how the heading is styled. (See below) ## log.heading * {String} Default: "" If set, a heading that is printed at the start of every line. ## log.stream * {Stream} Default: `process.stderr` The stream where output is written. ## log.enableColor() Force colors to be used on all messages, regardless of the output stream. ## log.disableColor() Disable colors on all messages. ## log.pause() Stop emitting messages to the stream, but do not drop them. ## log.resume() Emit all buffered messages that were written while paused. ## log.log(level, prefix, message, ...) * `level` {String} The level to emit the message at * `prefix` {String} A string prefix. Set to "" to skip. * `message...` Arguments to `util.format` Emit a log message at the specified level. ## log\[level](prefix, message, ...) For example, * log.silly(prefix, message, ...) * log.verbose(prefix, message, ...) * log.info(prefix, message, ...) * log.http(prefix, message, ...) * log.warn(prefix, message, ...) * log.error(prefix, message, ...) Like `log.log(level, prefix, message, ...)`. In this way, each level is given a shorthand, so you can do `log.info(prefix, message)`. ## log.addLevel(level, n, style, disp) * `level` {String} Level indicator * `n` {Number} The numeric level * `style` {Object} Object with fg, bg, inverse, etc. * `disp` {String} Optional replacement for `level` in the output. Sets up a new level with a shorthand function and so forth. Note that if the number is `Infinity`, then setting the level to that will cause all log messages to be suppressed. If the number is `-Infinity`, then the only way to show it is to enable all log messages. # Events Events are all emitted with the message object. * `log` Emitted for all messages * `log.` Emitted for all messages with the `` level. * `` Messages with prefixes also emit their prefix as an event. # Style Objects Style objects can have the following fields: * `fg` {String} Color for the foreground text * `bg` {String} Color for the background * `bold`, `inverse`, `underline` {Boolean} Set the associated property * `bell` {Boolean} Make a noise (This is pretty annoying, probably.) # Message Objects Every log event is emitted with a message object, and the `log.record` list contains all of them that have been created. They have the following fields: * `id` {Number} * `level` {String} * `prefix` {String} * `message` {String} Result of `util.format()` * `messageRaw` {Array} Arguments to `util.format()` npmlog-0.0.4/example.js000066400000000000000000000031251216744664400150170ustar00rootroot00000000000000var log = require('./log.js') log.heading = 'npm' console.error('log.level=silly') log.level = 'silly' log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) console.error('log.level=silent') log.level = 'silent' log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) console.error('log.level=info') log.level = 'info' log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('404', 'This is a longer\n'+ 'message, with some details\n'+ 'and maybe a stack.\n'+ new Error('a 404 error').stack) log.addLevel('noise', 10000, {beep: true}) log.noise(false, 'LOUD NOISES') npmlog-0.0.4/log.js000066400000000000000000000075571216744664400141620ustar00rootroot00000000000000var EE = require('events').EventEmitter var log = exports = module.exports = new EE var util = require('util') var ansi = require('ansi') log.cursor = ansi(process.stderr) log.stream = process.stderr // by default, let ansi decide based on tty-ness. var colorEnabled = undefined log.enableColor = function () { colorEnabled = true this.cursor.enabled = true } log.disableColor = function () { colorEnabled = false this.cursor.enabled = false } // default level log.level = 'info' // temporarily stop emitting, but don't drop log.pause = function () { this._paused = true } log.resume = function () { if (!this._paused) return this._paused = false var b = this._buffer this._buffer = [] b.forEach(function (m) { this.emitLog(m) }, this) } log._buffer = [] var id = 0 log.record = [] log.maxRecordSize = 10000 log.log = function (lvl, prefix, message) { var l = this.levels[lvl] if (l === undefined) { return this.emit('error', new Error(util.format( 'Undefined log level: %j', lvl))) } var a = new Array(arguments.length - 2) var stack = null for (var i = 2; i < arguments.length; i ++) { var arg = a[i-2] = arguments[i] // resolve stack traces to a plain string. if (typeof arg === 'object' && arg && (arg instanceof Error) && arg.stack) { arg.stack = stack = arg.stack + '' } } if (stack) a.unshift(stack + '\n') message = util.format.apply(util, a) var m = { id: id++, level: lvl, prefix: String(prefix || ''), message: message, messageRaw: a } this.emit('log', m) this.emit('log.' + lvl, m) if (m.prefix) this.emit(m.prefix, m) this.record.push(m) var mrs = this.maxRecordSize var n = this.record.length - mrs if (n > mrs / 10) { var newSize = Math.floor(mrs * 0.9) this.record = this.record.slice(-1 * newSize) } this.emitLog(m) }.bind(log) log.emitLog = function (m) { if (this._paused) { this._buffer.push(m) return } var l = this.levels[m.level] if (l === undefined) return if (l < this.levels[this.level]) return if (l > 0 && !isFinite(l)) return var style = log.style[m.level] var disp = log.disp[m.level] || m.level m.message.split(/\r?\n/).forEach(function (line) { if (this.heading) { this.write(this.heading, this.headingStyle) this.write(' ') } this.write(disp, log.style[m.level]) var p = m.prefix || '' if (p) this.write(' ') this.write(p, this.prefixStyle) this.write(' ' + line + '\n') }, this) } log.write = function (msg, style) { if (!this.cursor) return if (this.stream !== this.cursor.stream) { this.cursor = ansi(this.stream, { enabled: colorEnabled }) } style = style || {} if (style.fg) this.cursor.fg[style.fg]() if (style.bg) this.cursor.bg[style.bg]() if (style.bold) this.cursor.bold() if (style.underline) this.cursor.underline() if (style.inverse) this.cursor.inverse() if (style.beep) this.cursor.beep() this.cursor.write(msg).reset() } log.addLevel = function (lvl, n, style, disp) { if (!disp) disp = lvl this.levels[lvl] = n this.style[lvl] = style if (!this[lvl]) this[lvl] = function () { var a = new Array(arguments.length + 1) a[0] = lvl for (var i = 0; i < arguments.length; i ++) { a[i + 1] = arguments[i] } return this.log.apply(this, a) }.bind(this) this.disp[lvl] = disp } log.prefixStyle = { fg: 'magenta' } log.headingStyle = { fg: 'white', bg: 'black' } log.style = {} log.levels = {} log.disp = {} log.addLevel('silly', -Infinity, { inverse: true }, 'sill') log.addLevel('verbose', 1000, { fg: 'blue', bg: 'black' }, 'verb') log.addLevel('info', 2000, { fg: 'green' }) log.addLevel('http', 3000, { fg: 'green', bg: 'black' }) log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN') log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!') log.addLevel('silent', Infinity) npmlog-0.0.4/package.json000066400000000000000000000006351216744664400153170ustar00rootroot00000000000000{ "author": "Isaac Z. Schlueter (http://blog.izs.me/)", "name": "npmlog", "description": "logger for npm", "version": "0.0.4", "repository": { "type": "git", "url": "git://github.com/isaacs/npmlog.git" }, "main": "log.js", "scripts": { "test": "tap test/*.js" }, "dependencies": { "ansi": "~0.1.2" }, "devDependencies": { "tap": "" }, "license": "BSD" } npmlog-0.0.4/test/000077500000000000000000000000001216744664400140045ustar00rootroot00000000000000npmlog-0.0.4/test/basic.js000066400000000000000000000242141216744664400154260ustar00rootroot00000000000000var tap = require('tap') var log = require('../') var result = [] var logEvents = [] var logInfoEvents = [] var logPrefixEvents = [] var util = require('util') var resultExpect = [ '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[7m', 'sill', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'silly prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[34m', '\u001b[40m', 'verb', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'verbose prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[32m', '\u001b[7m', 'info', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'info prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[32m', 'http', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'http prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[30m', '\u001b[41m', 'WARN', '\u001b[0m', ' ', '\u001b[0m', '\u001b[33m', 'warn prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[31m', '\u001b[40m', 'ERR!', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'error prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[32m', '\u001b[7m', 'info', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'info prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[32m', 'http', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'http prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[30m', '\u001b[41m', 'WARN', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'warn prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[31m', '\u001b[40m', 'ERR!', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', 'error prefix', '\u001b[0m', ' x = {"foo":{"bar":"baz"}}\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[31m', '\u001b[40m', 'ERR!', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', '404', '\u001b[0m', ' This is a longer\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[31m', '\u001b[40m', 'ERR!', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', '404', '\u001b[0m', ' message, with some details\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[31m', '\u001b[40m', 'ERR!', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', '404', '\u001b[0m', ' and maybe a stack.\n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u001b[31m', '\u001b[40m', 'ERR!', '\u001b[0m', ' ', '\u001b[0m', '\u001b[35m', '404', '\u001b[0m', ' \n', '\u001b[0m', '\u001b[37m', '\u001b[40m', 'npm', '\u001b[0m', ' ', '\u001b[0m', '\u0007', 'noise', '\u001b[0m', '\u001b[35m', '', '\u001b[0m', ' LOUD NOISES\n', '\u001b[0m' ] var logPrefixEventsExpect = [ { id: 2, level: 'info', prefix: 'info prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 9, level: 'info', prefix: 'info prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 16, level: 'info', prefix: 'info prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] } ] // should be the same. var logInfoEventsExpect = logPrefixEventsExpect var logEventsExpect = [ { id: 0, level: 'silly', prefix: 'silly prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 1, level: 'verbose', prefix: 'verbose prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 2, level: 'info', prefix: 'info prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 3, level: 'http', prefix: 'http prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 4, level: 'warn', prefix: 'warn prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 5, level: 'error', prefix: 'error prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 6, level: 'silent', prefix: 'silent prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 7, level: 'silly', prefix: 'silly prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 8, level: 'verbose', prefix: 'verbose prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 9, level: 'info', prefix: 'info prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 10, level: 'http', prefix: 'http prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 11, level: 'warn', prefix: 'warn prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 12, level: 'error', prefix: 'error prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 13, level: 'silent', prefix: 'silent prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 14, level: 'silly', prefix: 'silly prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 15, level: 'verbose', prefix: 'verbose prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 16, level: 'info', prefix: 'info prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 17, level: 'http', prefix: 'http prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 18, level: 'warn', prefix: 'warn prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 19, level: 'error', prefix: 'error prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 20, level: 'silent', prefix: 'silent prefix', message: 'x = {"foo":{"bar":"baz"}}', messageRaw: [ 'x = %j', { foo: { bar: 'baz' } } ] }, { id: 21, level: 'error', prefix: '404', message: 'This is a longer\nmessage, with some details\nand maybe a stack.\n', messageRaw: [ 'This is a longer\nmessage, with some details\nand maybe a stack.\n' ] }, { id: 22, level: 'noise', prefix: false, message: 'LOUD NOISES', messageRaw: [ 'LOUD NOISES' ] } ] var Stream = require('stream').Stream var s = new Stream() s.write = function (m) { result.push(m) } s.writable = true s.isTTY = true s.end = function () {} log.stream = s log.heading = 'npm' tap.test('basic', function (t) { log.on('log', logEvents.push.bind(logEvents)) log.on('log.info', logInfoEvents.push.bind(logInfoEvents)) log.on('info prefix', logPrefixEvents.push.bind(logPrefixEvents)) console.error('log.level=silly') log.level = 'silly' log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) console.error('log.level=silent') log.level = 'silent' log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) console.error('log.level=info') log.level = 'info' log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) log.error('404', 'This is a longer\n'+ 'message, with some details\n'+ 'and maybe a stack.\n') log.addLevel('noise', 10000, {beep: true}) log.noise(false, 'LOUD NOISES') t.deepEqual(result, resultExpect, 'result') t.deepEqual(log.record, logEventsExpect, 'record') t.deepEqual(logEvents, logEventsExpect, 'logEvents') t.deepEqual(logInfoEvents, logInfoEventsExpect, 'logInfoEvents') t.deepEqual(logPrefixEvents, logPrefixEventsExpect, 'logPrefixEvents') t.end() })