{"id":15683441,"url":"https://github.com/andreafspeziale/nestjs-log","last_synced_at":"2026-03-06T08:34:13.526Z","repository":{"id":254749877,"uuid":"847451027","full_name":"andreafspeziale/nestjs-log","owner":"andreafspeziale","description":"Logger module for Nest framework (node.js) 🐈","archived":false,"fork":false,"pushed_at":"2025-05-07T08:25:37.000Z","size":2002,"stargazers_count":3,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-05-07T13:04:01.658Z","etag":null,"topics":["javascript","logger","logging","nestjs","nodejs","typescript","winston"],"latest_commit_sha":null,"homepage":"https://nestjs.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andreafspeziale.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-25T21:17:38.000Z","updated_at":"2025-05-07T00:04:46.000Z","dependencies_parsed_at":"2024-10-27T07:37:21.552Z","dependency_job_id":"1050f869-df63-454f-b69d-e09aa0ee4161","html_url":"https://github.com/andreafspeziale/nestjs-log","commit_stats":{"total_commits":19,"total_committers":2,"mean_commits":9.5,"dds":"0.10526315789473684","last_synced_commit":"c2cd16edfcf43a7402bfdca574ff345e8a509cc3"},"previous_names":["andreafspeziale/nestjs-log"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreafspeziale%2Fnestjs-log","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreafspeziale%2Fnestjs-log/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreafspeziale%2Fnestjs-log/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreafspeziale%2Fnestjs-log/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreafspeziale","download_url":"https://codeload.github.com/andreafspeziale/nestjs-log/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252883227,"owners_count":21819158,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","logger","logging","nestjs","nodejs","typescript","winston"],"created_at":"2024-10-03T17:05:25.018Z","updated_at":"2026-03-06T08:34:13.457Z","avatar_url":"https://github.com/andreafspeziale.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cp\u003e\n    \u003cimg src=\"./assets/logger-logo.png\" width=\"160\" alt=\"Logger Logo\" /\u003e\n    \u003cb\u003e\u003c/b\u003e\n    \u003cimg src=\"https://nestjs.com/img/logo_text.svg\" width=\"320\" alt=\"Nest Logo\" /\u003e\n  \u003c/p\u003e\n  \u003cp\u003e\n    Logger module and service for \u003ca href=\"https://github.com/nestjs/nest\" target=\"blank\"\u003eNest\u003c/a\u003e,\u003cbr\u003e\n    a progressive Node.js framework for building efficient and scalable server-side applications.\n  \u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://www.npmjs.com/@andreafspeziale/nestjs-log\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@andreafspeziale/nestjs-log\" alt=\"NPM Version\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.npmjs.com/@andreafspeziale/nestjs-log\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/npm/l/@andreafspeziale/nestjs-log.svg\" alt=\"Package License\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/andreafspeziale/nestjs-log/actions\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/andreafspeziale/nestjs-log/test.yml\" alt=\"Test Status\"/\u003e\u003c/a\u003e\n  \u003cp\u003e\n\u003c/div\u003e\n\n## Installation\n\n### npm\n\n```sh\nnpm install @andreafspeziale/nestjs-log\n```\n\n### yarn\n\n```sh\nyarn add @andreafspeziale/nestjs-log\n```\n\n### pnpm\n\n```sh\npnpm add @andreafspeziale/nestjs-log\n```\n\n## How to use?\n\n### Module\n\nThe module is \u003ca href=\"https://docs.nestjs.com/modules#global-modules\" target=\"blank\"\u003eGlobal\u003c/a\u003e by default.\n\n#### LoggerModule.forRoot(options)\n\n`src/core/core.module.ts`\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { LoggerModule } from '@andreafspeziale/nestjs-log';\n\n@Module({\n  imports: [\n    LoggerModule.forRoot({\n      level: LoggerLevel.Error,\n      customLevelsOrder: false\n      pretty: true,\n      colorize: false,\n      redact: ['password'],\n      exclude: ['/swagger'] // Exclude routes from LoggerInterceptor\n    }),\n  ],\n  ...\n})\nexport class CoreModule {}\n```\n\n- `level` is optional and its default is `Debug`\n- `customLevelsOrder` is optional and its default is `false` (Enables a personal levels hierarchy taste)\n- `pretty` is optional and its default is `true`\n- `colorize` is optional and its default is `true`\n- `redact` is optional and its default is []\n- `exclude` is optional and its default is []\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/sample-logs.png\" alt=\"Swagger example\" width=\"800\"\u003e\n\u003c/p\u003e\n\nBTW, by using defaults you can ignore the provided schemas described in the \"Environment variables management\" chapter and just:\n\n```ts\nexport const loggerModuleOptions = {\n  level: LoggerLevel.Debug,\n  customLevelsOrder: false,\n  pretty: true,\n  colorize: true,\n  redact: [],\n  exclude: [],\n};\n```\n\n`src/core/core.module.ts`\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { LoggerModule } from '@andreafspeziale/nestjs-log';\n\n@Module({\n  imports: [\n    LoggerModule.forRoot({}),\n  ],\n  ...\n})\nexport class CoreModule {}\n```\n\n#### LoggerModule.forRootAsync(options)\n\n`src/core/core.module.ts`\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { LoggerModule } from '@andreafspeziale/nestjs-log';\nimport { Config } from './config';\n\n@Module({\n  imports: [\n    ConfigModule.forRoot({\n      ....\n    }),\n    LoggerModule.forRootAsync({\n      useFactory: (cs: ConfigService\u003cConfig, true\u003e) =\u003e cs.get\u003cConfigService['logger']\u003e('logger'),\n      inject: [ConfigService],\n    }),\n  ],\n  ....\n})\nexport class CoreModule {}\n```\n\n### Decorators\n\n\u003e use the client and create your own service\n\n#### InjectLoggerOptions() and InjectLogger()\n\n`src/samples/samples.service.ts`\n\n```ts\nimport { Injectable } from '@nestjs/common';\nimport {\n  InjectLoggerOptions,\n  InjectLogger,\n  LoggerClient,\n  LoggerModuleOptions,\n  LoggerClient,\n} from '@andreafspeziale/nestjs-log';\n\n@Injectable()\nexport class SamplesService {\n  constructor(\n    @InjectLoggerOptions()\n    private readonly loggerModuleOptions: LoggerModuleOptions, // Showcase purposes\n    @InjectLogger() private readonly loggerClient: LoggerClient\n  ) {}\n\n  ....\n}\n```\n\n### Service\n\n\u003e out of the box service with a set of features\n\n#### LoggerService\n\n`src/samples/samples.service.ts`\n\n```ts\nimport { LoggerService } from '@andreafspeziale/nestjs-log';\nimport { SampleReturnType, MyParams } from './samples.interfaces'\n\n@Injectable()\nexport class SamplesService {\n  constructor(\n    private readonly loggerService: LoggerService\n  ) {\n    this.logger.setContext(SamplesService.name);\n  }\n\n  async sampleMethod(params: MyParams): Promise\u003cSampleReturn\u003e {\n    this.logger.debug('Doing something...', {\n      fn: this.sampleMethod.name,\n      params,\n    });\n\n    ....\n  }\n}\n```\n\nYou'll see:\n\n```sh\n{\n  context: 'SamplesService',\n  fn: 'sampleMethod',\n  params: {\n    ....,\n  },\n  reqId: '557a8e30-62e6-11ef-b821-ebc5f38e9e30',\n  level: 'debug',\n  message: 'Doing something...',\n  timestamp: '2024-08-25T13:31:28.843Z'\n}\n```\n\n`reqId` will be there as soon as you developing a backend server and:\n\n`src/main.ts`\n\n```ts\nimport { rTracerFastifyMiddleware } from '@andreafspeziale/nestjs-log';\n\nasync function bootstrap() {\n  const app = await NestFactory.create....;\n\n  ....\n\n  // I usually use Fastify but feel free to use Express importing rTracerExpressMiddleware instead of rTracerFastifyMiddleware\n  app.use(rTracerFastifyMiddleware());\n\n  ....\n\n  await app.listen....;\n}\nbootstrap();\n```\n\n### Middleware or Interceptor?\n\nUse `middleware` in case of `Express`, use interceptor in case of `Fastify`.\n\nAt each request you'll see something like this:\n\n```sh\n{\n  context: 'LoggerInterceptor',\n  fn: 'intercept',\n  request: {\n    route: 'POST /whatever',\n    query: {},\n    body: {\n      ....\n    }\n  },\n  reqId: '557a8e30-62e6-11ef-b821-ebc5f38e9e30',\n  level: 'http',\n  message: 'Incoming request...',\n  timestamp: '2024-08-25T13:31:28.798Z'\n}\n```\n\n#### Middleware\n\n`src/core/core.module.ts`\n\n```ts\nimport { LoggerMiddleware, LoggerModule } from '@andreafspeziale/nestjs-log';\nimport { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';\n\n@Module({\n  imports: [\n    ....,\n    LoggerModule....\n  ],\n  providers: [....],\n})\nexport class CoreModule implements NestModule {\n  configure(consumer: MiddlewareConsumer): void {\n    consumer\n      .apply(LoggerMiddleware)\n      .exclude('(.*)/healthz', '/swagger(.*)', '/favicon.ico')\n      .forRoutes('*');\n  }\n}\n```\n\n#### Interceptor\n\n`src/samples/samples.controller.ts`\n\n```ts\nimport { Body, Controller, Post, UseInterceptors } from '@nestjs/common';\nimport { LoggerInterceptor } from '@andreafspeziale/nestjs-log';\nimport { MyPayloadDTO, MyReturnDTO } from './dto';\nimport { SamplesService } from './samples.service';\n\n@Controller('samples')\n@UseInterceptors(LoggerInterceptor)\nexport class SearchController {\n  constructor(private readonly samplesService: SamplesService) {}\n\n  @Post()\n  async search(@Body() payload: MyPayloadDTO): Promise\u003cMyReturnDTO\u003e {\n    return this.samplesService.sampleMethod(payload);\n  }\n}\n```\n\nor\n\n`src/core/core.module.ts`\n\n```ts\nimport { LoggerInterceptor, LoggerModule } from '@andreafspeziale/nestjs-log';\nimport { Module } from '@nestjs/common';\nimport { APP_INTERCEPTOR } from '@nestjs/core';\n\n@Module({\n  imports: [\n    ....,\n    LoggerModule.... // Use the \"exclude\" module option to exclude routes from LoggerInterceptor\n  ],\n  providers: [{\n    provide: APP_INTERCEPTOR,\n    useClass: LoggerInterceptor,\n  }],\n})\nexport class CoreModule {}\n```\n\n### Environment variables management\n\nPlease refer to \u003ca href=\"https://github.com/andreafspeziale/nestjs-search\" target=\"blank\"\u003e`@andreafspeziale/nestjs-search`\u003c/a\u003e for more info about the environment variables features exported from my packages.\n\n`nestjs-log` exports some features as well.\n\n#### Zod\n\n```ts\nimport { loggerSchema } from '@andreafspeziale/nestjs-log/dist/zod';\n\n....\n```\n\n#### Class transformer/validator\n\n```ts\nimport { LoggerSchema, ILoggerSchema } from '@andreafspeziale/nestjs-search/dist/class-validator';\n\n....\n```\n\n## Test\n\n- `pnpm test`\n\n## Stay in touch\n\n- Author - [Andrea Francesco Speziale](https://twitter.com/andreafspeziale)\n- Website - [https://nestjs.com](https://nestjs.com/)\n- Twitter - [@nestframework](https://twitter.com/nestframework)\n\n## License\n\nnestjs-log [MIT licensed](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreafspeziale%2Fnestjs-log","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreafspeziale%2Fnestjs-log","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreafspeziale%2Fnestjs-log/lists"}