2013-06-10 10 views
10

Прямо сейчас в моем приложении, в определенные моменты мы регистрируем некоторые тяжелые вещи в файлах журнала.Асинхронное ведение журнала

В основном для ведения журнала мы создаем JSON доступных данных, а затем регистрируемся в файлах журнала. Это бизнес-требование для регистрации данных в формате JSON.

Теперь, создавая JSON из имеющихся данных, а затем регистрируясь в FILE, требуется много времени и влияет на время возврата оригинального запроса. Теперь идея состоит в том, чтобы улучшить положение.

Одна из вещей, которые мы обсуждали это, чтобы создать пул потоков с использованием

Executors.newSingleThreadExecutor() 

в коде, а затем представив задачу к нему, который делает преобразование данных в формат JSON и последующую регистрацию.

Является ли это хорошим подходом для этого? Поскольку мы управляем пулом потоков, он собирается создать некоторые проблемы?

Буду признателен, если кто-то сможет поделиться лучшими решениями. В некотором роде использовать Log4j для этого. Я пытался использовать AsyncAppender, но не достиг желаемого результата. Мы используем EJB 3, Jboss 5.0, Log4j, java6.

ответ

6

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

Слово предостережения при использовании пула потоков для регистрации Как несколько потоков будет работать над лог-файл (ы) и на бревне памяти буфера, вы должны быть осторожными о регистрации. Вам нужно добавить журналы в виде FIFO буфера, чтобы быть уверенным, что журналы печатаются в файлах журналов, отсортированных по метке времени. Также убедитесь, что доступ к файлам синхронизирован, и вы не сталкиваетесь с ситуацией, когда файл журнала перевернут или испорчен.

+0

Спасибо за то, что я уверен, что нужно идти в правильном направлении. Но мое единственное беспокойство в том, что я использую приложение, созданное threadpool ... создаст какую-либо проблему, или я могу каким-то образом использовать пул потоков jboss для этого. – Rips

3

Используется MongoDB for logging?

  1. MongoDB вставки можно сделать асинхронно. Не хотелось бы, чтобы пользовательский опыт остановился, если ведение журнала было медленным, застопорился или вниз. MongoDB предоставляет возможность сбрасывать вставку в коллекцию журналов и не дожидаться ответа кода ответа. (Если один хочет получить ответ, один вызывает getLastError() - мы пропустим это здесь.)
  2. Старые данные журнала автоматически LRU's out. Используя закрытые коллекции, мы предварительно распределяем пространство для журналов, и как только оно заполнено, обертывание журнала и повторное использование указанного пространства. Невозможно заполнить диск с чрезмерной информацией журнала, и нет необходимости записывать архивные записи журнала/ скриптов удаления.
  3. Это достаточно быстро для решения этой проблемы. Во-первых, MongoDB очень быстро работает в вообще, достаточно быстро для таких проблем. Во-вторых, при использовании закрытой коллекции порядок вставки сохраняется автоматически: нам не нужно создавать индекс на отметке времени. Это делает вещи даже быстрее, и важно, учитывая, что в используемом случае ведения журнала есть очень большое количество записей по сравнению с чтениями (напротив большинства проблем с базой данных ).
  4. Документированный/JSON - отличный формат для информации журнала. Очень гибкая и «схематичная» в том смысле, что мы можем в любое время добавить в поле поле.
+1

Ну спасибо за этот обмен, но я не думаю, что мы по этому пути в настоящее время. – Rips

5

Посмотрите на Logback, AsyncAppender уже предоставляет отдельный пул потоков, очередь и т. Д. И легко настраивается, он почти делает то же самое, что и вы, но спасает вас от повторного создания колеса.

+0

Есть ли разница между этим и log4j.AsyncAppender? Также как часть этого, я не хочу только регистрировать asychronosuly, но также конвертировать данные в JSON. – Rips

+0

@Rips Если у вас есть и другая задача (например, преобразование данных), тогда ваше решение тоже нормально. Что касается log4j vs logback, то разработка log4j прекращается, и функция logback активна. Для получения дополнительной информации о log4j vs logback см. Это [ссылка] (http://stackoverflow.com/questions/178215/log4j-vs-logback) –

0

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

Отказ от ответственности: Я один из разработчиков CoralLog

Смежные вопросы