From 97bd0a1f1302239bcf4333452425745d4100eca2 Mon Sep 17 00:00:00 2001 From: Alexander Buntakov Date: Tue, 8 Jun 2021 13:20:55 +0300 Subject: [PATCH] add excepltion-handler-logger-spring-web --- README.md | 4 ++ .../build.gradle.kts | 15 +++++++ .../ExceptionHandlerLoggerConfiguration.kt | 25 +++++++++++ .../handler/spring/logger/DefaultLogger.kt | 25 +++++++++++ .../BaseLogExceptionResolverResultImpl.kt | 43 +++++++++++++++++++ .../resolvers/LogExceptionResolverResult.kt | 11 +++++ settings.gradle.kts | 1 + 7 files changed, 124 insertions(+) create mode 100644 exception-handler-logger-spring-web/build.gradle.kts create mode 100644 exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/configurations/ExceptionHandlerLoggerConfiguration.kt create mode 100644 exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/DefaultLogger.kt create mode 100644 exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/BaseLogExceptionResolverResultImpl.kt create mode 100644 exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/LogExceptionResolverResult.kt diff --git a/README.md b/README.md index aada39f..5eba7c5 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,7 @@ Interceptor для логирования запросов/ответов. ## exception-handler-spring-web Перехватывает ошибки сервера, определяет код ошибки и возвращает их в правильный `response` + +## exception-handler-logger-spring-web + +Добавляет логирование в обработку ошибок diff --git a/exception-handler-logger-spring-web/build.gradle.kts b/exception-handler-logger-spring-web/build.gradle.kts new file mode 100644 index 0000000..37b0dab --- /dev/null +++ b/exception-handler-logger-spring-web/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + id("kotlin") + id("kotlin-spring") + id("maven-publish") +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + implementation("org.springframework.boot:spring-boot-starter-web") + + implementation(project(":common-spring")) + implementation(project(":logger-spring")) + implementation(project(":exception-handler-spring-web")) +} diff --git a/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/configurations/ExceptionHandlerLoggerConfiguration.kt b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/configurations/ExceptionHandlerLoggerConfiguration.kt new file mode 100644 index 0000000..d93fd54 --- /dev/null +++ b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/configurations/ExceptionHandlerLoggerConfiguration.kt @@ -0,0 +1,25 @@ +package ru.touchin.exception.handler.spring.configurations +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import ru.touchin.exception.handler.spring.logger.DefaultLogger +import ru.touchin.exception.handler.spring.logger.Logger +import ru.touchin.exception.handler.spring.logger.resolvers.LogExceptionResolverResult +import ru.touchin.logger.dto.LogData +import ru.touchin.logger.factory.LogBuilderFactory +import ru.touchin.logger.spring.EnableSpringLogger + +@Configuration +@ComponentScan("ru.touchin.exception.handler.spring.logger.resolvers") +@EnableSpringLogger +class ExceptionHandlerLoggerConfiguration { + + @Bean + fun logger( + logExceptionResolverResults: List>, + logBuilderFactory: LogBuilderFactory, + ): Logger { + return DefaultLogger(logExceptionResolverResults, logBuilderFactory) + } + +} diff --git a/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/DefaultLogger.kt b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/DefaultLogger.kt new file mode 100644 index 0000000..2afc99d --- /dev/null +++ b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/DefaultLogger.kt @@ -0,0 +1,25 @@ +package ru.touchin.exception.handler.spring.logger + +import ru.touchin.exception.handler.dto.ExceptionResolverResult +import ru.touchin.exception.handler.spring.logger.resolvers.LogExceptionResolverResult +import ru.touchin.logger.dto.LogData +import ru.touchin.logger.factory.LogBuilderFactory + +class DefaultLogger( + private val logExceptionResolverResults: List>, + private val logBuilderFactory: LogBuilderFactory, + ) : Logger { + + override fun log(clazz: Class<*>, exceptionResolverResult: ExceptionResolverResult) { + logBuilderFactory.create(this::class.java) + .let { initialBuilder -> + logExceptionResolverResults.fold(initialBuilder) { builder, resolver -> + resolver(exceptionResolverResult, builder) + } + } + .also { builder -> + builder.build().log() + } + } + +} diff --git a/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/BaseLogExceptionResolverResultImpl.kt b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/BaseLogExceptionResolverResultImpl.kt new file mode 100644 index 0000000..6ac141f --- /dev/null +++ b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/BaseLogExceptionResolverResultImpl.kt @@ -0,0 +1,43 @@ +@file:Suppress("unused") +package ru.touchin.exception.handler.spring.logger.resolvers + +import org.springframework.core.annotation.Order +import org.springframework.stereotype.Component +import ru.touchin.common.spring.Ordered +import ru.touchin.common.spring.web.dto.ApiError +import ru.touchin.exception.handler.dto.ExceptionResolverResult +import ru.touchin.logger.builder.LogBuilder +import ru.touchin.logger.context.DefaultContextFields +import ru.touchin.logger.context.LoggerExecutionContext +import ru.touchin.logger.dto.LogData +import ru.touchin.logger.dto.LogError + +@Order(Ordered.HIGH) +@Component +class BaseLogExceptionResolverResultImpl : LogExceptionResolverResult { + + override fun invoke( + exceptionResolverResult: ExceptionResolverResult, + logBuilder: LogBuilder + ): LogBuilder { + val errorCode = exceptionResolverResult.apiError.errorCode + + return logBuilder + .setError(exceptionResolverResult.exception) + .also { builder -> + val errorTag = if (errorCode == ApiError.FAILURE_CODE) { + LogError.ERROR_FATAL_TAG + } else { + LogError.ERROR_BASE_TAG + } + + builder.addTags(errorTag) + } + .also { + LoggerExecutionContext.current.updateContext { context -> + context.plus(DefaultContextFields.appCode.name to errorCode) + } + } + } + +} diff --git a/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/LogExceptionResolverResult.kt b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/LogExceptionResolverResult.kt new file mode 100644 index 0000000..22a3625 --- /dev/null +++ b/exception-handler-logger-spring-web/src/main/kotlin/ru/touchin/exception/handler/spring/logger/resolvers/LogExceptionResolverResult.kt @@ -0,0 +1,11 @@ +@file:Suppress("unused") +package ru.touchin.exception.handler.spring.logger.resolvers + +import ru.touchin.exception.handler.dto.ExceptionResolverResult +import ru.touchin.logger.builder.LogBuilder + +interface LogExceptionResolverResult { + + operator fun invoke(exceptionResolverResult: ExceptionResolverResult, logBuilder: LogBuilder): LogBuilder + +} diff --git a/settings.gradle.kts b/settings.gradle.kts index d019e22..3e016cf 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -29,3 +29,4 @@ include("logger") include("logger-spring") include("logger-spring-web") include("exception-handler-spring-web") +include("exception-handler-logger-spring-web")