Я работаю над структурой ведения журнала для системы предприятия и рассматриваю как logback, так и log4j как протоколирование бэкэндов, но пытаюсь использовать slf4j, чтобы сохранить из него бэкэнд-реализацию.Ведение журнала произвольных объектов
Мы хотим зарегистрировать сообщения в формате JSON, и я нашел класс Layout для log4j и Encoder для журнала, который это делает. Однако мы хотели бы иметь возможность добавлять произвольные пары ключ/значение к выходу JSON.
Я надеялся, что макет/кодировщик сможет определить, какой тип объекта был зарегистрирован, а в случае Карты он добавит пары ключ/значение в JSON, но для чего-либо еще он будет просто toString() Это.
Это, похоже, невозможно, поскольку интерфейс slf4j, по-видимому, ограничен регистрацией объектов String.
Я читал о маркерах, MDC и NDC, но ни один из них, похоже, не соответствует моим потребностям.
Чтобы уточнить, вот фрагмент кода, который будет оптимальным:
Map m = new HashMap();
m.put("foo", "bar");
m.put("baz", "fluffbunny");
log.info(m);
Это будет выводить что-то вроде:
{ "timestamp": "2013-03-04T13:33:40", "foo": "bar", "baz": "fluffbunny" }
или
{ "timestamp": "2013-03-04T13:33:40", "message": { "foo": "bar", "baz": "fluffbunny" } }
Там будут какие-то обходные пути такие как передача строк JSON в качестве сообщения или использование MDC вокруг операторов журнала (мой макет/кодировщик классы правильно отображают MDC и NDC), но это в обоих случаях загромождает строки журнала.
Так что мой вопрос в том, есть ли какой-нибудь удобный способ сделать это. Придерживание SLF4J является несомненным плюсом, но, возможно, не является необходимым, если преимущества использования конкретного бэкэнда перевешивают преимущества отсутствия агностики.
Скрыть эту реализацию журнала класса за свои собственные, добавить перегрузку информации, которая принимает карты в качестве аргумента? –