diff --git a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/LambdaRuntime.kt b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/LambdaRuntime.kt index 133508b..eb4d8af 100644 --- a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/LambdaRuntime.kt +++ b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/LambdaRuntime.kt @@ -3,6 +3,7 @@ package io.github.trueangle.knative.lambda.runtime import io.github.trueangle.knative.lambda.runtime.LambdaEnvironmentException.NonRecoverableStateException import io.github.trueangle.knative.lambda.runtime.api.Context import io.github.trueangle.knative.lambda.runtime.api.LambdaClient +import io.github.trueangle.knative.lambda.runtime.api.dto.LogMessageDto import io.github.trueangle.knative.lambda.runtime.handler.LambdaBufferedHandler import io.github.trueangle.knative.lambda.runtime.handler.LambdaHandler import io.github.trueangle.knative.lambda.runtime.handler.LambdaStreamHandler @@ -23,6 +24,7 @@ import io.ktor.utils.io.ByteWriteChannel import io.ktor.utils.io.writeStringUtf8 import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule import kotlin.system.exitProcess import kotlin.time.TimeSource import io.ktor.client.plugins.logging.LogLevel as KtorLogLevel @@ -31,7 +33,9 @@ object LambdaRuntime { private val httpClient = HttpClient(Curl) { install(HttpTimeout) install(ContentNegotiation) { - json(Json { explicitNulls = false }) + json(Json { + explicitNulls = false + }) } install(Logging) { val kLogger = KtorLogger() diff --git a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/api/dto/LogMessageDto.kt b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/api/dto/LogMessageDto.kt index 38e0e7f..acef9d9 100644 --- a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/api/dto/LogMessageDto.kt +++ b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/api/dto/LogMessageDto.kt @@ -1,8 +1,12 @@ package io.github.trueangle.knative.lambda.runtime.api.dto import io.github.trueangle.knative.lambda.runtime.log.LogLevel +import kotlinx.serialization.Contextual +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder @Serializable internal data class LogMessageDto( diff --git a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/JsonLogFormatter.kt b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/JsonLogFormatter.kt index 48dcbd4..2f7354d 100644 --- a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/JsonLogFormatter.kt +++ b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/JsonLogFormatter.kt @@ -3,10 +3,13 @@ package io.github.trueangle.knative.lambda.runtime.log import io.github.trueangle.knative.lambda.runtime.api.Context import io.github.trueangle.knative.lambda.runtime.api.dto.LogMessageDto import kotlinx.datetime.Clock +import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.SerializationException import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import kotlinx.serialization.serializer +@OptIn(InternalSerializationApi::class) internal class JsonLogFormatter : LogFormatter { private var requestContext: Context? = null @@ -15,12 +18,16 @@ internal class JsonLogFormatter : LogFormatter { Json.encodeToString( LogMessageDto( timestamp = Clock.System.now().toString(), - message = if (message is Throwable) message.prettyPrint() else message, + message = if (message is Throwable) message.prettyPrint() else message?.let { + it::class.serializer() + }, level = logLevel, awsRequestId = requestContext?.awsRequestId ) ) } catch (e: SerializationException) { + Log.warn("Log serialisation error: ${e.message}") + Json.encodeToString( LogMessageDto( timestamp = Clock.System.now().toString(), diff --git a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/KtorLogger.kt b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/KtorLogger.kt index 7aa5bce..232b9a4 100644 --- a/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/KtorLogger.kt +++ b/lambda-runtime/src/commonMain/kotlin/io/github/trueangle/knative/lambda/runtime/log/KtorLogger.kt @@ -7,14 +7,12 @@ internal class KtorLogger : Logger { override fun log(message: String) = when (getLevel()) { KtorLogLevel.ALL -> Log.trace(message) KtorLogLevel.BODY -> Log.debug(message) - KtorLogLevel.INFO -> Log.info(message) else -> Unit } fun getLevel() = when (Log.currentLogLevel) { LogLevel.TRACE -> KtorLogLevel.ALL LogLevel.DEBUG -> KtorLogLevel.BODY - LogLevel.INFO -> KtorLogLevel.INFO else -> KtorLogLevel.NONE } }