2013-03-04 9 views
3

Я работаю над структурой ведения журнала для системы предприятия и рассматриваю как 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 является несомненным плюсом, но, возможно, не является необходимым, если преимущества использования конкретного бэкэнда перевешивают преимущества отсутствия агностики.

+2

Скрыть эту реализацию журнала класса за свои собственные, добавить перегрузку информации, которая принимает карты в качестве аргумента? –

ответ

2

я бы просто иметь LoggableMap, который выводит JSON в качестве своего toString, используя SLF4J

Map m = new Loggable(); 
m.put("foo", "bar"); 
m.put("baz", "fluffbunny"); 
// Note the use of {} to log an arbitrary object rather than a String 
log.info("{}", m); 
Смежные вопросы