bs-logger
Advanced tools
Comparing version 0.1.1 to 0.2.1
# Changelog | ||
## 0.1.0 | ||
## 0.2.1 | ||
- [FEATURE] Adds testing helpers | ||
## 0.1.1 | ||
- First release |
@@ -5,5 +5,5 @@ import { LogMethod, Logger, createLogger, lastSequenceNumber, resetSequence } from './logger'; | ||
import { LogMessage, LogMessageFormatter, LogMessageTranslator, registerLogFormatter, resetLogFormatters } from './logger/message'; | ||
import { rootLogger, setup } from './logger/root'; | ||
import { DEFAULT_LOG_TARGET, LogTarget, parseLogTargets } from './logger/target'; | ||
declare const __setup: (factory?: () => Logger) => void; | ||
declare const logger: Logger; | ||
export { logger as default, logger, createLogger, DEFAULT_LOG_TARGET, lastSequenceNumber, LogContext, LogContexts, Logger, LogLevelName, logLevelNameFor, LogLevels, LogMessage, LogMessageFormatter, LogMessageTranslator, LogMethod, LogTarget, parseLogLevel, parseLogTargets, registerLogFormatter, resetLogFormatters, resetSequence, __setup, }; | ||
import * as testing from './testing'; | ||
export { rootLogger as default, rootLogger as logger, setup, createLogger, DEFAULT_LOG_TARGET, lastSequenceNumber, LogContext, LogContexts, Logger, LogLevelName, logLevelNameFor, LogLevels, LogMessage, LogMessageFormatter, LogMessageTranslator, LogMethod, LogTarget, parseLogLevel, parseLogTargets, registerLogFormatter, resetLogFormatters, resetSequence, testing, }; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var tslib_1 = require("tslib"); | ||
var e_1, _a; | ||
var logger_1 = require("./logger"); | ||
@@ -18,52 +17,11 @@ exports.createLogger = logger_1.createLogger; | ||
exports.resetLogFormatters = message_1.resetLogFormatters; | ||
var root_1 = require("./logger/root"); | ||
exports.default = root_1.rootLogger; | ||
exports.logger = root_1.rootLogger; | ||
exports.setup = root_1.setup; | ||
var target_1 = require("./logger/target"); | ||
exports.DEFAULT_LOG_TARGET = target_1.DEFAULT_LOG_TARGET; | ||
exports.parseLogTargets = target_1.parseLogTargets; | ||
var cache_getters_1 = require("./utils/cache-getters"); | ||
var cache; | ||
// tslint:disable-next-line:variable-name | ||
var __setup = function (factory) { | ||
if (factory === void 0) { factory = function () { return logger_1.createLogger({ targets: process.env.LOG_TARGETS }); }; } | ||
cache = cache_getters_1.cacheGetters({ | ||
get root() { | ||
return factory(); | ||
}, | ||
}, 'root'); | ||
}; | ||
exports.__setup = __setup; | ||
// creates a lazy logger as default export | ||
var logger = (function () { | ||
var args = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
args[_i] = arguments[_i]; | ||
} | ||
return cache.root.apply(cache, tslib_1.__spread(args)); | ||
}); | ||
exports.default = logger; | ||
exports.logger = logger; | ||
var props = tslib_1.__spread(level_1.LogLevelNames, ['child', 'wrap']); | ||
var _loop_1 = function (prop) { | ||
Object.defineProperty(logger, prop, { | ||
enumerable: true, | ||
configurable: true, | ||
get: function () { | ||
return cache.root[prop]; | ||
}, | ||
}); | ||
}; | ||
try { | ||
for (var props_1 = tslib_1.__values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) { | ||
var prop = props_1_1.value; | ||
_loop_1(prop); | ||
} | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
finally { | ||
try { | ||
if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1); | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
} | ||
cache_getters_1.cacheGetters.apply(void 0, tslib_1.__spread([logger], props)); | ||
__setup(); | ||
var testing = tslib_1.__importStar(require("./testing")); | ||
exports.testing = testing; | ||
//# sourceMappingURL=index.js.map |
@@ -37,2 +37,2 @@ import { LogContext } from './context'; | ||
declare const createLogger: ({ context: baseContext, targets: logTargets, translate: logTranslator, }?: CreateLoggerOptions) => Logger; | ||
export { createLogger, lastSequenceNumber, Logger, LogMethod, resetSequence }; | ||
export { createLogger, lastSequenceNumber, Logger, LogMethod, resetSequence, CreateLoggerOptions }; |
{ | ||
"name": "bs-logger", | ||
"version": "0.1.1", | ||
"version": "0.2.1", | ||
"description": "Bare simple logger for NodeJS", | ||
@@ -5,0 +5,0 @@ "author": "Huafu Gandon <huafu.gandon@gmail.com>", |
@@ -192,2 +192,79 @@ <img align="right" src="icon.png"></img> | ||
### Testing | ||
The whole `testing` namespace has useful helpers for using BSLogger while unit testing your product. | ||
In your tests you would usually prefer not having any logging to happen, or you would like to check what has been logged but without actually logging it to any target. | ||
The `testing` namespace holds all testing utilities: | ||
```js | ||
import { testing } from 'bs-logger' | ||
``` | ||
- If you use the root logger, here is how to disable its output: | ||
```js | ||
testing.setup() | ||
``` | ||
and the `logger` (or `default`) export will become a `LoggerMock` instance (see below). | ||
- If you create logger(s) using `createLogger`, when testing use the `testing.createLoggerMock` instead. It accepts the same first argument, with an extra second argument, optional, being the `LogTargetMock` to be used (see below). | ||
#### LoggerMock | ||
Loggers created using the `testing` namespace will have one and only one log target being a `LogTargetMock`, and that target will be set on the `target` extra property of the logger. | ||
Here are the extra properties of `LogTargetMock` which you can then use for testing: | ||
- **messages** `LogMessage[]`: all log message objects which would have normally be logged | ||
- **last** `LogMessage`: the last one being logged | ||
- **trace** `LogMessage[]`: all log message objects with `trace` level | ||
- **last** `LogMessage`: last one with `trace` level | ||
- **debug** `LogMessage[]`: all log message objects with `debug` level | ||
- **last** `LogMessage`: last one with `debug` level | ||
- ... | ||
- **lines** `string[]`: all formatted log message lines which would have normally be logged | ||
- **last** `string`: the last one being logged | ||
- **trace** `string[]`: all formatted log message lines with `trace` level | ||
- **last** `string`: last one with `trace` level | ||
- **debug** `string[]`: all formatted log message lines with `debug` level | ||
- **last** `string`: last one with `debug` level | ||
- ... | ||
- **clear** `() => void`: method to clear all log message objects and formatted lines | ||
- **filteredMessages** `(level: number | null, untilLevel?: number) => LogMessage[]`: method to filter log message objects | ||
- **filteredLins** `(level: number | null, untilLevel?: number) => string[]`: method to filter formatted log message lines | ||
#### Example | ||
Let's say you have a `logger.js` file in which you create the logger for your app: | ||
```js | ||
// file: logger.js | ||
import { testing, createLogger, LogContexts } from 'bs-logger'; | ||
const factory = process.env.TEST ? testing.createLoggerMock : createLogger; | ||
export default factory({ [LogContexts.application]: 'foo' }); | ||
``` | ||
In a test you could: | ||
```js | ||
import logger from './logger'; | ||
// in `fetch(url)` you'd use the logger like `logger.debug({url}, 'GET')` when the request is actually made | ||
import fetch from './http'; | ||
test('it should cache request', () => { | ||
logger.target.clear(); | ||
fetch('http://foo.bar/dummy.json'); | ||
expect(logger.target.messages.length).toBe(1); | ||
fetch('http://foo.bar/dummy.json'); | ||
expect(logger.target.messages.length).toBe(1); | ||
// you can also expect on the message: | ||
expect(logger.target.messages.last.message).toBe('GET') | ||
expect(logger.target.messages.last.context.url).toBe('http://foo.bar/dummy.json') | ||
// or (mock target formater prefix the message with `[level:xxx] ` when there is a level) | ||
expect(logger.target.lines.last).toBe('[level:20] GET') | ||
// or filtering with level: | ||
expect(logger.target.lines.debug.last).toBe('[level:20] GET') | ||
}); | ||
``` | ||
## Installing | ||
@@ -194,0 +271,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
82205
34
736
320