Log4j не поддерживает двоичный формат журналирования? - PullRequest
7 голосов
/ 11 апреля 2011

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

Кажется, что вся система Layout по своей природе основана на String, а это значит, что я не могу использовать замечательные апдендеры для прокрутки файлов. LoggingEvent является сериализуемым, так что я подумываю о создании приложения для двоичных файлов, но я чувствую, что не должен вступать здесь в новую ситуацию.

Я что-то упускаю из виду?

Ответы [ 5 ]

6 голосов
/ 11 апреля 2011

У меня недавно была очень похожая проблема. Мне пришлось записать строку журнала в двоичный формат, но я также хотел, чтобы все остальные приложения работали нормально.

Я реализовал свой собственный appender, который расширяет AppenderSkeleton и принимает объект LoggingEvent , где сообщение, возвращаемое getMessage(), является моим собственным объектом.

Я также пишу класс, реализующий ObjectRenderer , который будет вызывать класс Layout приложения, чтобы преобразовать регистрируемый объект (тот, который я зарегистрировал) в строку.

Затем для моего собственного аппендера (у которого нет макета) сообщение сериализуется в двоичную форму и записывается в некоторый поток байтов. Для других приложений объект макета вызывает средство визуализации моего объекта, и сообщение сериализуется в строку.

Таким образом, все обычные приложения работают одинаково, и я все еще могу добавить свой собственный формат.

В итоге:

  • Запись собственного объекта регистрации, используемого таким образом: logger.info(LogEntry)
  • Реализация ObjectRenderer для преобразования LogEntry в String
  • Расширить AppenderSkeleton с моим собственным BinaryFormatAppender

Я не знаю ни одного готового решения для этого.

2 голосов
/ 11 апреля 2011

У меня была похожая проблема, и я решил ее, используя формат JSON, который, хотя texttual по-прежнему, возможно, быстрее и проще для обработки, чем XML.

В log4j.properties я установил следующий формат:

log4j.appender.A1.layout.ConversionPattern = {"time":"%d", "msg": %m},%n

, что делает его действительным JSON, а само сообщение также является объектом JSON, например:

myLogger.info("{...the contents of the object...}")

В моем случае содержимое сообщения создается из объекта Java с использованием сериализатора Jackson,вот так:

static ObjectMapper MAPPER= new ObjectMapper();
MAPPER.writeValueAsString(myObject);

Полученные файлы журналов могут быть обработаны с любой проблемой, которая понимает JSON, его просто нужно обернуть в

 [ <<file contents>>, {}]
1 голос
/ 11 апреля 2011

В дистрибутиве log4j ничего нет.

Вы могли бы взглянуть на http://sourceforge.net/projects/bclf/, но, вероятно, в конечном итоге вы напишите свой собственный Appender и реализуете doAppend (LogginEvent).

0 голосов
/ 11 апреля 2011

Как ни странно, текст читается машиной. Подумайте только о том, чтобы установить формат ведения журнала на что-то, что легко разобрать, и в итоге вы получите журнал, который удобен для чтения человеком и машиной.

0 голосов
/ 11 апреля 2011

Пока журналы являются "регулярными", тогда машина может анализировать регулярные выражения довольно легко. Если вас беспокоит размер и XML, вы можете сжать логи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...