nestjs-pino
Advanced tools
Comparing version
@@ -10,3 +10,3 @@ "use strict"; | ||
decoratedLoggers.add(context); | ||
return common_1.Inject(getLoggerToken(context)); | ||
return (0, common_1.Inject)(getLoggerToken(context)); | ||
} | ||
@@ -13,0 +13,0 @@ exports.InjectPinoLogger = InjectPinoLogger; |
@@ -63,4 +63,4 @@ "use strict"; | ||
Logger = __decorate([ | ||
common_1.Injectable(), | ||
__param(1, common_1.Inject(params_1.PARAMS_PROVIDER_TOKEN)), | ||
(0, common_1.Injectable)(), | ||
__param(1, (0, common_1.Inject)(params_1.PARAMS_PROVIDER_TOKEN)), | ||
__metadata("design:paramtypes", [PinoLogger_1.PinoLogger, Object]) | ||
@@ -67,0 +67,0 @@ ], Logger); |
@@ -34,3 +34,3 @@ "use strict"; | ||
}; | ||
const decorated = InjectPinoLogger_1.createProvidersForDecorated(); | ||
const decorated = (0, InjectPinoLogger_1.createProvidersForDecorated)(); | ||
return { | ||
@@ -48,3 +48,3 @@ module: LoggerModule_1, | ||
}; | ||
const decorated = InjectPinoLogger_1.createProvidersForDecorated(); | ||
const decorated = (0, InjectPinoLogger_1.createProvidersForDecorated)(); | ||
const providers = [ | ||
@@ -79,5 +79,5 @@ Logger_1.Logger, | ||
LoggerModule = LoggerModule_1 = __decorate([ | ||
common_1.Global(), | ||
common_1.Module({ providers: [Logger_1.Logger], exports: [Logger_1.Logger] }), | ||
__param(0, common_1.Inject(params_1.PARAMS_PROVIDER_TOKEN)), | ||
(0, common_1.Global)(), | ||
(0, common_1.Module)({ providers: [Logger_1.Logger], exports: [Logger_1.Logger] }), | ||
__param(0, (0, common_1.Inject)(params_1.PARAMS_PROVIDER_TOKEN)), | ||
__metadata("design:paramtypes", [Object]) | ||
@@ -91,7 +91,15 @@ ], LoggerModule); | ||
if (Array.isArray(params)) { | ||
return [pinoHttp(...params), bindLoggerMiddleware]; | ||
const middleware = pinoHttp(...params); | ||
// @ts-expect-error: root is readonly field, but this is the place where | ||
// it's set actually | ||
PinoLogger_1.PinoLogger.root = middleware.logger; | ||
return [middleware, bindLoggerMiddleware]; | ||
} | ||
const middleware = pinoHttp(params); | ||
// @ts-expect-error: root is readonly field, but this is the place where | ||
// it's set actually | ||
PinoLogger_1.PinoLogger.root = middleware.logger; | ||
// FIXME: params type here is pinoHttp.Options | pino.DestinationStream | ||
// pinoHttp has two overloads, each of them takes those types | ||
return [pinoHttp(params), bindLoggerMiddleware]; | ||
return [middleware, bindLoggerMiddleware]; | ||
} | ||
@@ -101,4 +109,4 @@ function bindLoggerMiddleware(req, _res, next) { | ||
// be called without arguments | ||
storage_1.storage.run(req.log, next); | ||
storage_1.storage.run(new storage_1.Store(req.log), next); | ||
} | ||
//# sourceMappingURL=LoggerModule.js.map |
{ | ||
"name": "nestjs-pino", | ||
"version": "2.0.2", | ||
"version": "2.1.0-alpha.0a6fbe", | ||
"description": "Pino logger for NestJS", | ||
@@ -58,3 +58,3 @@ "main": "index.js", | ||
"eslint-plugin-prettier": "^3.4.1", | ||
"jest": "27.0.6", | ||
"jest": "27.1.0", | ||
"memorystream": "^0.3.1", | ||
@@ -61,0 +61,0 @@ "pino-http": "^5.6.0", |
@@ -6,5 +6,10 @@ import * as pino from 'pino'; | ||
export declare class PinoLogger implements PinoMethods { | ||
/** | ||
* root is the most root logger that can be used to change params at runtime. | ||
* Accessible only when `useExisting` is not set to `true` in `Params`. | ||
* Readonly, but you can change it's properties. | ||
*/ | ||
static readonly root: pino.Logger; | ||
private context; | ||
private readonly contextName; | ||
private readonly opts; | ||
constructor({ pinoHttp, renameContext }: Params); | ||
@@ -26,3 +31,4 @@ trace(msg: string, ...args: any[]): void; | ||
get logger(): pino.Logger; | ||
assign(fields: pino.Bindings): void; | ||
} | ||
export {}; |
@@ -14,2 +14,3 @@ "use strict"; | ||
}; | ||
var PinoLogger_1; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -25,5 +26,7 @@ exports.PinoLogger = exports.__resetOutOfContextForTests = void 0; | ||
outOfContext = undefined; | ||
// @ts-ignore reset root for tests only | ||
PinoLogger.root = undefined; | ||
} | ||
exports.__resetOutOfContextForTests = __resetOutOfContextForTests; | ||
let PinoLogger = class PinoLogger { | ||
let PinoLogger = PinoLogger_1 = class PinoLogger { | ||
constructor({ pinoHttp, renameContext }) { | ||
@@ -35,3 +38,3 @@ this.context = ''; | ||
} | ||
else if (params_1.isPassedLogger(pinoHttp)) { | ||
else if ((0, params_1.isPassedLogger)(pinoHttp)) { | ||
outOfContext = pinoHttp.logger; | ||
@@ -49,3 +52,2 @@ } | ||
this.contextName = renameContext || 'context'; | ||
this.opts = pinoHttp; | ||
} | ||
@@ -98,10 +100,18 @@ trace(...args) { | ||
get logger() { | ||
var _a; | ||
// outOfContext is always set in runtime before starts using | ||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion | ||
return storage_1.storage.getStore() || outOfContext; | ||
return ((_a = storage_1.storage.getStore()) === null || _a === void 0 ? void 0 : _a.logger) || outOfContext; | ||
} | ||
assign(fields) { | ||
const store = storage_1.storage.getStore(); | ||
if (!store) { | ||
throw new Error(`${PinoLogger_1.name}: unable to assign extra fields out of request scope`); | ||
} | ||
store.logger = store.logger.child(fields); | ||
} | ||
}; | ||
PinoLogger = __decorate([ | ||
common_1.Injectable({ scope: common_1.Scope.TRANSIENT }), | ||
__param(0, common_1.Inject(params_1.PARAMS_PROVIDER_TOKEN)), | ||
PinoLogger = PinoLogger_1 = __decorate([ | ||
(0, common_1.Injectable)({ scope: common_1.Scope.TRANSIENT }), | ||
__param(0, (0, common_1.Inject)(params_1.PARAMS_PROVIDER_TOKEN)), | ||
__metadata("design:paramtypes", [Object]) | ||
@@ -108,0 +118,0 @@ ], PinoLogger); |
@@ -11,3 +11,3 @@ <p align="center"> | ||
</a> | ||
<img alt="GitHub branch checks state" src="https://img.shields.io/github/checks-status/iamolegga/nestjs-pino/master"> | ||
<img alt="GitHub branch checks state" src="https://badgen.net/github/checks/iamolegga/nestjs-pino"> | ||
<a href="https://codeclimate.com/github/iamolegga/nestjs-pino/test_coverage"> | ||
@@ -378,2 +378,49 @@ <img src="https://api.codeclimate.com/v1/badges/2821150bb93506cb66fc/test_coverage" /> | ||
## Assign extra fields for future calls | ||
You can enrich logs before calling log methods. It's possible by using `assign` method of `PinoLogger` instance. As `Logger` class is used only for NestJS built-in `Logger` substitution via `app.useLogger(...)` this feature is only limited to `PinoLogger` class. Example: | ||
```ts | ||
@Controller('/') | ||
class TestController { | ||
constructor( | ||
private readonly logger: PinoLogger, | ||
private readonly service: MyService, | ||
) {} | ||
@Get() | ||
get() { | ||
// assign extra fields in one place... | ||
this.logger.assign({ userID: '42' }); | ||
return this.service.test(); | ||
} | ||
} | ||
@Injectable() | ||
class MyService { | ||
private readonly logger = new Logger(MyService.name); | ||
test() { | ||
// ...and it will be logged in another one | ||
this.logger.log('hello world'); | ||
} | ||
} | ||
``` | ||
## Change pino params at runtime | ||
Pino root instance with passed via module registration params creates a separate child logger for every request. This root logger params can be changed at runtime via `PinoLogger.root` property which is the pointer to logger instance. Example: | ||
```ts | ||
@Controller('/') | ||
class TestController { | ||
@Post('/change-loggin-level') | ||
setLevel() { | ||
PinoLogger.root.level = 'info'; | ||
return null; | ||
} | ||
} | ||
``` | ||
## Migration | ||
@@ -380,0 +427,0 @@ |
/// <reference types="node" /> | ||
import { AsyncLocalStorage } from 'async_hooks'; | ||
import { Logger } from 'pino'; | ||
export declare const storage: AsyncLocalStorage<Logger>; | ||
export declare class Store { | ||
logger: Logger; | ||
constructor(logger: Logger); | ||
} | ||
export declare const storage: AsyncLocalStorage<Store>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.storage = void 0; | ||
exports.storage = exports.Store = void 0; | ||
const async_hooks_1 = require("async_hooks"); | ||
class Store { | ||
constructor(logger) { | ||
this.logger = logger; | ||
} | ||
} | ||
exports.Store = Store; | ||
exports.storage = new async_hooks_1.AsyncLocalStorage(); | ||
//# sourceMappingURL=storage.js.map |
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
51796
5.33%482
7.59%621
8.19%1
Infinity%