Я использую Kotlin с Klogger и у меня есть подобная этой функции, которая позволяет мне передавать лямбду, которая создает карту и позволяет мне устанавливать пары ключ-значение в качестве маркеров:
Код: Выделить всё
fun KLogger.debug(msg: () -> Any?, extra: (MutableMap) -> Unit) {
if (isDebugEnabled) {
val entries = mutableMapOf().apply { extra(this) }
debug(appendEntries(entries), msg)
}
}
Код: Выделить всё
class CustomJsonGeneratorDecorator : JsonGeneratorDecorator {
override fun decorate(generator: JsonGenerator) = CappedFieldJsonGenerator(generator)
}
class CappedFieldJsonGenerator(delegate: JsonGenerator) : JsonGeneratorDelegate(delegate) {
companion object {
private const val MAX_FIELD_LENGTH = 3
}
override fun writeRawUTF8String(text: ByteArray?, offset: Int, length: Int) {
super.writeRawUTF8String(text, offset, min(MAX_FIELD_LENGTH, length))
}
override fun writeUTF8String(text: ByteArray, offset: Int, length: Int) {
super.writeUTF8String(text, offset, min(MAX_FIELD_LENGTH, length))
}
override fun writeString(reader: Reader, len: Int) {
super.writeString(reader, min(MAX_FIELD_LENGTH, len))
}
override fun writeString(text: CharArray, offset: Int, len: Int) {
super.writeString(text, offset, min(MAX_FIELD_LENGTH, len))
}
override fun writeString(text: SerializableString) {
this.writeString(text.value)
}
override fun writeString(text: String) {
super.writeString(text.substring(0, min(MAX_FIELD_LENGTH, text.length)))
}
}
data class NestedObject(val name: String = "nested")
data class TestObject(
val name: String = "hello",
val nested: NestedObject = NestedObject(),
)
class TestObjectSerializer @JvmOverloads constructor(t: Class? = null) :
StdSerializer(t) {
override fun serialize(value: NestedObject, gen: JsonGenerator, provider: SerializerProvider) {
gen.writeStartObject()
gen.writeStringField("name", "serialized")
gen.writeStringField("class", gen::class.java.name)
gen.writeEndObject()
}
}
class CustomJsonFactoryDecorator : JsonFactoryDecorator {
override fun decorate(factory: JsonFactory): JsonFactory {
val mapper = factory.codec as ObjectMapper
val module = SimpleModule()
module.addSerializer(NestedObject::class.java, TestObjectSerializer())
mapper.registerModule(module)
return factory
}
}
Код: Выделить всё
logger.info({ "debug" }) {
it["test_object"] = TestObject()
it["plain_string"] = "string"
}
Код: Выделить всё
{"@timestamp":"202","@version":"1","message":"deb","logger_name":"com","thread_name":"mai","level":"INF","level_value":20000,"dd.service":"sem","dd.env":"aws","dd.version":"0.0","test_object":{"name":"hello","nested":{"name":"serialized","class":"com.fasterxml.jackson.core.json.UTF8JsonGenerator"}},"plain_string":"str","pod_name":"sem","pod_namespace":"dev","node_name":"ip-","node_ip":"10."}
Есть идеи о том, как обеспечить постоянное использование моего собственного генератора?
Подробнее здесь: https://stackoverflow.com/questions/793 ... stash-logb