diff --git a/commons/src/main/kotlin/eu/miaplatform/commons/ktor/MiaCallLogging.kt b/commons/src/main/kotlin/eu/miaplatform/commons/ktor/MiaCallLogging.kt deleted file mode 100644 index 5524356..0000000 --- a/commons/src/main/kotlin/eu/miaplatform/commons/ktor/MiaCallLogging.kt +++ /dev/null @@ -1,111 +0,0 @@ -package eu.miaplatform.commons.ktor - -import io.ktor.events.* -import io.ktor.server.application.* -import io.ktor.server.application.hooks.* -import io.ktor.server.http.content.* -import io.ktor.server.plugins.callloging.* -import io.ktor.util.* -import io.ktor.util.date.* -import org.slf4j.event.* - -internal val CALL_START_TIME = AttributeKey<Long>("CallStartTime") - -/** - * Returns time in millis from the moment the call was received until now - */ -public fun ApplicationCall.processingTimeMillis(clock: () -> Long = { getTimeMillis() }): Long { - val startTime = attributes[CALL_START_TIME] - return clock() - startTime -} - -/** - * A plugin that allows you to log incoming client requests. - * You can configure [CallLogging] in multiple ways: specify a logging level, - * filter requests based on a specified condition, customize log messages, and so on. - * - * You can learn more from [Call logging](https://ktor.io/docs/call-logging.html). - */ -public val CallLogging: ApplicationPlugin<CallLoggingConfig> = createApplicationPlugin( - "CallLogging", - ::CallLoggingConfig -) { - val log = pluginConfig.logger ?: application.log - val filters = pluginConfig.filters - val formatCall = pluginConfig.formatCall - val clock = pluginConfig.clock - val ignoreStaticContent = pluginConfig.ignoreStaticContent - - fun log(message: String) = when (pluginConfig.level) { - Level.ERROR -> log.error(message) - Level.WARN -> log.warn(message) - Level.INFO -> log.info(message) - Level.DEBUG -> log.debug(message) - Level.TRACE -> log.trace(message) - } - - fun logSuccess(call: ApplicationCall) { - if ((ignoreStaticContent && call.isStaticContent()) || (filters.isNotEmpty() && filters.none { it(call) })) { - return - } - log(formatCall(call)) - } - - setupMDCProvider() - setupLogging(application.monitor, ::log) - - on(CallSetup) { call -> - call.attributes.put(CALL_START_TIME, clock()) - } - - if (pluginConfig.mdcEntries.isEmpty()) { - logCompletedCalls(::logSuccess) - return@createApplicationPlugin - } - - logCallsWithMDC(::logSuccess) -} - -private fun PluginBuilder<CallLoggingConfig>.logCompletedCalls(logSuccess: (ApplicationCall) -> Unit) { - on(ResponseSent) { call -> - logSuccess(call) - } -} - -private fun PluginBuilder<CallLoggingConfig>.logCallsWithMDC(logSuccess: (ApplicationCall) -> Unit) { - val entries = pluginConfig.mdcEntries - - on(MDCHook(ApplicationCallPipeline.Monitoring)) { call, proceed -> - withMDC(entries, call, proceed) - } - - on(MDCHook(ApplicationCallPipeline.Call)) { call, proceed -> - withMDC(entries, call, proceed) - } - - on(ResponseSent) { call -> - withMDC(entries, call) { - logSuccess(call) - } - } -} - -private fun setupLogging(events: Events, log: (String) -> Unit) { - val starting: (Application) -> Unit = { log("Application starting: $it") } - val started: (Application) -> Unit = { log("Application started: $it") } - val stopping: (Application) -> Unit = { log("Application stopping: $it") } - var stopped: (Application) -> Unit = {} - - stopped = { - log("Application stopped: $it") - events.unsubscribe(ApplicationStarting, starting) - events.unsubscribe(ApplicationStarted, started) - events.unsubscribe(ApplicationStopping, stopping) - events.unsubscribe(ApplicationStopped, stopped) - } - - events.subscribe(ApplicationStarting, starting) - events.subscribe(ApplicationStarted, started) - events.subscribe(ApplicationStopping, stopping) - events.subscribe(ApplicationStopped, stopped) -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ffed3a2..a595206 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index 8271b4a..426caa4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,8 +3,6 @@ rootProject.name = 'ktor-gradle-template' include('commons') include('service') -enableFeaturePreview("VERSION_CATALOGS") - dependencyResolutionManagement { repositories { mavenCentral() @@ -14,24 +12,24 @@ dependencyResolutionManagement { libs { // junit5 version('junit-jupiter', junit_version.toString()) - alias('mockk').to('io.mockk','mockk').version('1.12.0') - alias('assertk').to('com.willowtreeapps.assertk','assertk-jvm').version('0.24') - alias('kotest').to('io.kotest','kotest-runner-junit5').version('5.8.0') - alias('junit-jupiter-api').to('org.junit.jupiter','junit-jupiter-api').versionRef('junit-jupiter') - alias('junit-jupiter-engine').to('org.junit.jupiter','junit-jupiter-engine').versionRef('junit-jupiter') - alias('junit-jupiter-params').to('org.junit.jupiter','junit-jupiter-params').versionRef('junit-jupiter') + library('mockk', 'io.mockk:mockk:1.12.0') + library('assertk', 'com.willowtreeapps.assertk:assertk-jvm:0.24') + library('kotest', 'io.kotest:kotest-runner-junit5:5.8.0') + library('junit-jupiter-api', 'org.junit.jupiter', 'junit-jupiter-api').versionRef('junit-jupiter') + library('junit-jupiter-engine', 'org.junit.jupiter', 'junit-jupiter-engine').versionRef('junit-jupiter') + library('junit-jupiter-params', 'org.junit.jupiter', 'junit-jupiter-params').versionRef('junit-jupiter') bundle('testImpl-testSuite', ['junit-jupiter-api', 'junit-jupiter-engine', 'junit-jupiter-params', 'mockk', 'assertk', 'kotest']) // ktor version('ktor', ktor_version.toString()) - alias('ktor-netty').to('io.ktor','ktor-server-netty').versionRef('ktor') - alias('ktor-server-core').to('io.ktor','ktor-server-core').versionRef('ktor') - alias('ktor-client-core').to('io.ktor','ktor-client-core-jvm').versionRef('ktor') - alias('ktor-logging').to('io.ktor','ktor-server-call-logging').versionRef('ktor') - alias('ktor-content-negotiation').to('io.ktor','ktor-server-content-negotiation').versionRef('ktor') - alias('ktor-jackson').to('io.ktor','ktor-serialization-jackson').versionRef('ktor') - alias('ktor-status-pages').to('io.ktor','ktor-server-status-pages').versionRef('ktor') - alias('ktor-openapi').to('dev.forst','ktor-openapi-generator').version('0.6.1') + library('ktor-netty', 'io.ktor', 'ktor-server-netty').versionRef('ktor') + library('ktor-server-core', 'io.ktor', 'ktor-server-core').versionRef('ktor') + library('ktor-client-core', 'io.ktor', 'ktor-client-core-jvm').versionRef('ktor') + library('ktor-logging', 'io.ktor', 'ktor-server-call-logging').versionRef('ktor') + library('ktor-content-negotiation', 'io.ktor', 'ktor-server-content-negotiation').versionRef('ktor') + library('ktor-jackson', 'io.ktor', 'ktor-serialization-jackson').versionRef('ktor') + library('ktor-status-pages', 'io.ktor', 'ktor-server-status-pages').versionRef('ktor') + library('ktor-openapi', 'dev.forst:ktor-openapi-generator:0.6.1') bundle( 'impl-ktor', [ @@ -45,25 +43,25 @@ dependencyResolutionManagement { 'ktor-openapi' ] ) - alias('ktor-server-tests').to('io.ktor','ktor-server-tests').versionRef('ktor') + library('ktor-server-tests', 'io.ktor', 'ktor-server-tests').versionRef('ktor') bundle('testImpl-ktor', ['ktor-server-tests']) // logback - alias('logback-classic').to('ch.qos.logback','logback-classic').version('1.4.14') - alias('logback-encoder').to('net.logstash.logback','logstash-logback-encoder').version('6.0') + library('logback-classic', 'ch.qos.logback:logback-classic:1.4.14') + library('logback-encoder', 'net.logstash.logback:logstash-logback-encoder:6.0') bundle('impl-logback', ['logback-classic','logback-encoder']) // jackson version('jackson', jackson_version.toString()) - alias('jackson-databind').to('com.fasterxml.jackson.core','jackson-databind').versionRef('jackson') - alias('jackson-kotlin').to('com.fasterxml.jackson.module','jackson-module-kotlin').versionRef('jackson') - alias('jackson-datatype').to('com.fasterxml.jackson.datatype','jackson-datatype-jsr310').versionRef('jackson') - bundle('impl-jackson',['jackson-databind','jackson-kotlin','jackson-datatype']) + library('jackson-databind', 'com.fasterxml.jackson.core', 'jackson-databind').versionRef('jackson') + library('jackson-kotlin', 'com.fasterxml.jackson.module', 'jackson-module-kotlin').versionRef('jackson') + library('jackson-datatype', 'com.fasterxml.jackson.datatype', 'jackson-datatype-jsr310').versionRef('jackson') + bundle('impl-jackson',['jackson-databind','jackson-kotlin', 'jackson-datatype']) // retrofit version('retrofit', retrofit_version.toString()) - alias('retrofit-retrofit').to('com.squareup.retrofit2','retrofit').versionRef('retrofit') - alias('retrofit-converter-jackson').to('com.squareup.retrofit2','converter-jackson').versionRef('retrofit') + library('retrofit-retrofit', 'com.squareup.retrofit2', 'retrofit').versionRef('retrofit') + library('retrofit-converter-jackson', 'com.squareup.retrofit2', 'converter-jackson').versionRef('retrofit') bundle('impl-retrofit',['retrofit-retrofit','retrofit-converter-jackson']) } }