add excepltion-handler-logger-spring-web

This commit is contained in:
Alexander Buntakov 2021-06-08 13:20:55 +03:00
parent f6ed057ece
commit 97bd0a1f13
7 changed files with 124 additions and 0 deletions

View File

@ -75,3 +75,7 @@ Interceptor для логирования запросов/ответов.
## exception-handler-spring-web
Перехватывает ошибки сервера, определяет код ошибки и возвращает их в правильный `response`
## exception-handler-logger-spring-web
Добавляет логирование в обработку ошибок

View File

@ -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"))
}

View File

@ -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<LogExceptionResolverResult<LogData>>,
logBuilderFactory: LogBuilderFactory<LogData>,
): Logger {
return DefaultLogger(logExceptionResolverResults, logBuilderFactory)
}
}

View File

@ -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<LogExceptionResolverResult<LogData>>,
private val logBuilderFactory: LogBuilderFactory<LogData>,
) : 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()
}
}
}

View File

@ -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<LogData> {
override fun invoke(
exceptionResolverResult: ExceptionResolverResult,
logBuilder: LogBuilder<LogData>
): LogBuilder<LogData> {
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)
}
}
}
}

View File

@ -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<T> {
operator fun invoke(exceptionResolverResult: ExceptionResolverResult, logBuilder: LogBuilder<T>): LogBuilder<T>
}

View File

@ -29,3 +29,4 @@ include("logger")
include("logger-spring")
include("logger-spring-web")
include("exception-handler-spring-web")
include("exception-handler-logger-spring-web")