feat: ROPS-1356 enhance CatchException decorator with log level support#54
feat: ROPS-1356 enhance CatchException decorator with log level support#54iago-f-s-e wants to merge 2 commits intomainfrom
Conversation
ghost
left a comment
There was a problem hiding this comment.
🌴 Atualmente, não há cobertura de testes para os diferentes níveis de log. Ter esses testes é importante para garantir que a funcionalidade esteja funcionando como esperado e para evitar regressões.
Alguns pontos que talvez valha a pena explorarmos ao pensar nesses testes:
-
Possíveis formas de validar se cada nível (
warn,info,debug,error) está sendo aplicado corretamente quando especificado. -
Como poderíamos abordar testes para o caso em que o nível é definido por uma função dinâmica.
-
De que maneira podemos verificar se o nível de log continua sendo preservado quando usado em conjunto com
AsyncTraceStorageetypeErrorHandling: 'REGISTER'. -
Quais cenários de borda fariam sentido cobrir (por exemplo, função retornando um nível inválido, nível não informado, etc.).
| ): void { | ||
| switch (level) { | ||
| case 'warn': | ||
| logger.warn(title || error.message, error, ...params); |
There was a problem hiding this comment.
🌴 Acredito que aqui as informações críticas do erro (stack trace, nome, kind) são perdidas quando logadas com níveis warn, info ou debug. O erro passado como parâmetro não será formatado corretamente no log, pois os métodos logger.warn(), logger.info() e logger.debug() esperam apenas message: string e ...params: any[], não um objeto de erro.
Para níveis não-error, precisamos incluir as informações do erro no log de forma adequada, similar ao que é feito no nível error com getErrorPattern(). Como podemos garantir que essas informações sejam preservadas?
|
|
||
| if (options?.typeErrorHandling === 'REGISTER') { | ||
| AsyncTraceStorage.registeredError = { error, trigger: logger.trigger, title, params }; | ||
| AsyncTraceStorage.registeredError = { |
There was a problem hiding this comment.
🌴 A função catchException (apesar de já estar deprecated) ainda não foi atualizada para suportar a opção level. Atualmente, ela sempre utiliza logger.error() e registra os logs com level: 'error'.
Isso acaba gerando uma inconsistência em relação ao decorator @CatchException. Além disso, usuários que ainda dependem de catchException não conseguem se beneficiar da nova funcionalidade de configuração de nível de log.
Alguns pontos que podemos avaliar:
-
Como garantir que a função
catchExceptionrespeite a opçãolevelquando ela for informada? -
Existe a possibilidade de reutilizar a lógica que já está implementada no decorator
@CatchException? -
Mesmo sendo deprecated, faz sentido manter consistência de comportamento entre as duas abordagens?
|
🌴 Talvez valha a pena avaliarmos uma possível refatoração da interface LoggerService para dar um suporte melhor ao log de erros em níveis diferentes de error. Hoje, os métodos Alguns pontos que podem servir como base para discussão:
|
Description
This PR introduces the
leveloption to the@CatchExceptiondecorator, allowing developers to specify different log levels for exceptions based on their severity. This addresses the need to differentiate between critical errors and expected exceptions like business rule violations.Previously, all exceptions were logged as
errorlevel, which made it difficult to distinguish between critical system failures and expected application flows (e.g., validation errors, business rule violations).ROPS-1356
Changes Made
LogLeveltype: Created'error' | 'warn' | 'info' | 'debug'type insrc/lib/core/dtos/registered-error.dto.tsCatchExceptionOptions: Addedlevelproperty that accepts:LogLevelvalue(exception: any, context?: any, ...params: any[]) => LogLevelRegisteredErrorDTO: Addedlevel: LogLevelfield to preserve log level when usingtypeErrorHandling: 'REGISTER'@CatchExceptiondecorator: Implements log level determination and uses appropriate logger method (error,warn,info,debug)AsyncTraceStorage: ModifiedregisteredErrorsetter to use completeRegisteredErrorDTOtypeChecklist
Additional Notes
Usage Examples
Fixed Level
Dynamic Level