Как использовать мой собственный генератор при десериализации классов данных в logstash-logbackJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать мой собственный генератор при десериализации классов данных в logstash-logback

Сообщение Anonymous »

Я написал собственный генератор для усечения текстовых полей после определенной длины, но, похоже, он не работает с полями классов данных.
Я использую Kotlin с Klogger и у меня есть подобная этой функции, которая позволяет мне передавать лямбду, которая создает карту и позволяет мне устанавливать пары ключ-значение в качестве маркеров:

Код: Выделить всё

fun KLogger.debug(msg: () -> Any?, extra: (MutableMap) -> Unit) {
if (isDebugEnabled) {
val entries = mutableMapOf().apply { extra(this) }
debug(appendEntries(entries), msg)
}
}
Чтобы проверить это, я написал собственный сериализатор для класса данных NestedObject, специальный JsonFactory для добавления этого сериализатора и собственный JsonGenerator для фактического усечения:

Код: Выделить всё

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."}
Как видите, логика усечения работает со всеми полями (включая маркеры обычного текста), за исключением полей TestObject и полей NestedObject с специальный сериализатор. Кажется, пользовательский сериализатор получает UTF8JsonGenerator вместо моего CappedFieldJsonGenerator.
Есть идеи о том, как обеспечить постоянное использование моего собственного генератора?

Подробнее здесь: https://stackoverflow.com/questions/793 ... stash-logb
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»