기본
NestLogged를 사용하는 기본 중의 기본은 메서드의 호출과 반환에 로그를 추가하는 것입니다.
Controller 메서드의 경우 LoggedRoute, 이외의 경우 LoggedFunction 데코레이터를 기존의 메서드에 추가해 간단하게 호출과 반환 로그를 출력하도록 할 수 있습니다.
Copy // Controller의 경우
import { LoggedRoute } from 'nestlogged';
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@LoggedRoute()
@Get()
public async findAllCats() {
// ...
}
}
/*
LoggedRoute 로그 메시지:
[Nest] 4208 - 01/12/2024, 5:16:02 PM LOG [CatsController] HIT HTTP CatsController::/[GET] (findAllCats)
...
[Nest] 4208 - 01/12/2024, 5:16:02 PM LOG [CatsController] RETURNED HTTP CatsController::/[GET] (findAllCats)
*/
// Service의 경우
import { LoggedFunction } from 'nestlogged';
import { Injectable } from '@nestjs/common';
@Injectable()
export class CatsService {
@LoggedFunction()
public async findAllCats() {
// ...
}
}
/*
LoggedFunction 로그 메시지:
[Nest] 23564 - 01/12/2024, 5:17:40 PM LOG [CatsService] CALL findAllCats
...
[Nest] 23564 - 01/12/2024, 5:17:40 PM LOG [CatsService] RETURNED findAllCats
*/
데코레이터 옵션
각각의 데코레이터를 설정하기 위해서 옵션을 줄 수 있습니다.
두 데코레이터 모두 동일한 타입의 옵션을 받으며, 옵션의 형태와 기본값은 다음과 같습니다.
Copy interface OverrideBuildOptions {
callLogLevel: LogLevel | 'skip';
returnLogLevel: LogLevel | 'skip';
errorLogLevel: LogLevel | 'skip';
/** @deprecated use `callLogLevel: 'skip'` instead */
skipCallLog: boolean;
/** @deprecated use `returnLogLevel: 'skip'` instead */
skipReturnLog: boolean;
/** @deprecated use `errorLogLevel: 'skip'` instead */
skipErrorLog: boolean;
}
const defaultOverrideBuildOptions: OverrideBuildOptions = {
callLogLevel: 'log',
returnLogLevel: 'log',
errorLogLevel: 'error',
skipCallLog: false,
skipReturnLog: false,
skipErrorLog: false,
}
export function LoggedFunction<F extends Array<any>, R>(
options?: Partial<OverrideBuildOptions>
) {
...
}
export function LoggedRoute<F extends Array<any>, R>(
route?: string,
options?: Partial<OverrideBuildOptions>
) {
...
}
로거 초기화
LoggedFunction이나 LoggedRoute는 실행되는 시점에서 자체적으로 클래스 내부에 Logger를 초기화시키고 (기존 logger 프로퍼티가 있을 경우 기존 프로퍼티 이용), 각 요청마다 새로운 ScopedLogger를 초기화 및 이용합니다.
ScopedLogger는 NestLogged에서 범위 로깅을 위해 자체적으로 구현한 새로운 로거입니다. 다만, 단순히 로그의 포맷에 범위를 추가할 뿐 완전히 새로운 로깅 시스템을 쓰는 것은 아닙니다. 내부적으로는 여전히 @nestjs/common
에서 export된 Logger
를 사용하고 있습니다.
범위 로깅에 대한 자세한 부분은 로거 주입과 범위 로깅 을 참고하세요.
커스텀 Route
LoggedFunction과 달리 LoggedRoute의 경우 선택적으로 route 파라미터를 제공할 수 있습니다.
LoggedRoute는 이 route 파라미터를 로그에 포함하며, route 파라미터가 주어지지 않았을 경우 nestjs의 @Get
, @Post
등의 데코레이터에 주는 route 파라미터(없을 경우 기본값 /
)가 대신 이용됩니다.
예를 들어, 아래 예제의 경우 LoggedRoute 데코레이터에 route 파라미터가 주어지지 않았고, 또한 Get 데코레이터에도 주어지지 않았으므로 로그에서 route는 /
가 됩니다.
Copy @Controller('cats')
export class CatsController {
@LoggedRoute()
@Get()
public async findAllCats() {
// ...
}
}
/*
LoggedRoute 로그 메시지:
route
v
... HIT HTTP CatsController::/[GET] (findAllCats)
...
route
v
... RETURNED HTTP CatsController::/[GET] (findAllCats)
*/
이제 Get에 '/findall'
과 같은 route 값을 줄 경우, 로그에서의 route는 /findall
이 됩니다.
Copy @Controller('cats')
export class CatsController {
@LoggedRoute()
@Get('/findall') // 'findall' route
public async findAllCats() {
// ...
}
}
/*
LoggedRoute 로그 메시지:
route
vvvvvvvv
... HIT HTTP CatsController::/findall[GET] (findAllCats)
...
route
vvvvvvvv
... RETURNED HTTP CatsController::/findall[GET] (findAllCats)
*/
그러나, LoggedRoute의 route 파라미터가 최종적으로 로그에 쓰이게 됩니다.
Copy @Controller('cats')
export class CatsController {
@LoggedRoute('findAllCats') // 'findAllCats' route
@Get('/findall')
public async findAllCats() {
// ...
}
}
/*
LoggedRoute 로그 메시지:
route
vvvvvvvvvvv
... HIT HTTP CatsController::findAllCats[GET] (findAllCats)
...
route
vvvvvvvvvvv
... RETURNED HTTP CatsController::findAllCats[GET] (findAllCats)
*/
LoggedRoute의 route 파라미터에 값을 제공해 로그의 출력 값이 바뀌었더라도 여전히 요청 시의 route는 nestjs의 Get, Post 등의 데코레이터에 제공한 route라는 점을 알아두세요.
즉, 위의 예제에서 LoggedRoute의 파라미터에는 'findAllCats'
값이 제공되었지만, HTTP 요청 시에는 여전히 /cats/findall
입니다.