diff --git a/backend/docs/logging.md b/backend/docs/logging.md new file mode 100644 index 0000000..d5bc025 --- /dev/null +++ b/backend/docs/logging.md @@ -0,0 +1,54 @@ +# Logging + +Die Logging-Funktionen werden durch das Interface `LoggerService` abstrahiert. Dadurch kann später einfacher zu einem anderen Logger gewechselt werden. Aktuell wird der von NestJS bereitgestellte `ConsoleLogger` () verwendet. Dieser erfüllt das `LoggerService` Interface. + +## Logging Level + +Es werden vier Logging Level unterstützt, um unterschiedliche Dringlichkeitsstufen zu repräsentieren: + +- **log**: allgemeine Informationen +- **error**: Fehler +- **warn**: Warnungen +- **debug**: Informationen zur Fehlerbehebung + +## Beispiel + +Im Modul wird der Logger Service als Provider registriert. Dabei kann mit dem Parameter `useClass` die konkrete Implementierung gewählt werden. + +```ts +import { ConsoleLogger, Module } from '@nestjs/common'; +import { ExampleController } from './example.controller'; +import { LOGGER_SERVICE } from './logger/logger.service'; + +@Module({ + controllers: [ExampleController], + providers: [ + { + useClass: ConsoleLogger, + provide: LOGGER_SERVICE, + }, + ], +}) +export class ExampleModule {} +``` + +In z.B. einem Controller kann dann durch Dependency Injection auf den Logger zugegriffen werden. Dafür wird dieser als Parameter im Konstruktor übergeben und mit dem `@Inject`-Decorator versehen. + +```ts +import { Controller, Get, Inject } from '@nestjs/common'; +import { LOGGER_SERVICE, LoggerService } from './logger/logger.service'; + +@Controller() +export class ExampleController { + constructor( + @Inject(LOGGER_SERVICE) + private readonly loggerService: LoggerService, + ) {} + + @Get('/example') + getExample(): string { + this.loggerService.log('example log message'); + return 'example'; + } +} +``` diff --git a/backend/src/app.controller.spec.ts b/backend/src/app.controller.spec.ts index f9ad156..a05479f 100644 --- a/backend/src/app.controller.spec.ts +++ b/backend/src/app.controller.spec.ts @@ -1,16 +1,17 @@ import { ConsoleLogger } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; +import { LoggerService } from './logger/logger.service'; describe('AppController', () => { let appController: AppController; - let logger: ConsoleLogger; + let loggerService: LoggerService; let appService: AppService; beforeEach(async () => { appService = new AppService(); - logger = new ConsoleLogger(); - appController = new AppController(appService, logger); + loggerService = new ConsoleLogger(); + appController = new AppController(appService, loggerService); }); describe('getPing', () => { diff --git a/backend/src/app.controller.ts b/backend/src/app.controller.ts index 793e47d..009c7cc 100644 --- a/backend/src/app.controller.ts +++ b/backend/src/app.controller.ts @@ -1,11 +1,13 @@ -import { ConsoleLogger, Controller, Get } from '@nestjs/common'; +import { Controller, Get, Inject } from '@nestjs/common'; import { AppService } from './app.service'; +import { LOGGER_SERVICE, LoggerService } from './logger/logger.service'; @Controller() export class AppController { constructor( private readonly appService: AppService, - private readonly logger: ConsoleLogger, + @Inject(LOGGER_SERVICE) + private readonly loggerService: LoggerService, ) {} /** @@ -14,7 +16,7 @@ export class AppController { */ @Get('/ping') getPing(): string { - this.logger.log('ping'); + this.loggerService.log('ping'); return this.appService.getPing(); } } diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index e3b4d33..743c869 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -3,10 +3,17 @@ import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthModule } from './auth/auth.module'; import { UserController } from './api/user/user.controller'; +import { LOGGER_SERVICE } from './logger/logger.service'; @Module({ imports: [AuthModule], controllers: [AppController, UserController], - providers: [AppService, ConsoleLogger], + providers: [ + AppService, + { + useClass: ConsoleLogger, + provide: LOGGER_SERVICE, + }, + ], }) export class AppModule {} diff --git a/backend/src/logger/logger.service.ts b/backend/src/logger/logger.service.ts new file mode 100644 index 0000000..5349b23 --- /dev/null +++ b/backend/src/logger/logger.service.ts @@ -0,0 +1,8 @@ +export const LOGGER_SERVICE = 'LOGGER_SERVICE'; + +export interface LoggerService { + log(message: string): void; + error(message: string): void; + warn(message: string): void; + debug(message: string): void; +}