|
|
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Всем доброго вечера. Прошу помощи по такому вопросу. Есть распределенная система из нескольких серверов приложений, а именно на Glassfish. "Наружу" выставлены несколько веб-сервисов. Требуется складывать лог вызовов к сервисам в централизованное хранилище - в БД. Грубо говоря это просто скинуть request и response. Вроде бы несложно, но! Как всегда доп. требования )) Требуется детализация по операциям внутри сервиса с иерархией вызовов, т.е. если у EJB вызывается метод, то надо залогировать и его. В итоге в БД складываются записи в виде дерева, отражающего иерархию вызовов. EJB могут быть remote. Извините, если путанно объясняюсь. Вообще не представляю как это сделать, в голове каша. На J2EE перешел со спринга, много чего недогоняю. Есть общая идея. Аннотациями помечать логгируемые методы, на интерцепторах обрабатывать лог вызываемых методов, но как это реализовать - непонятно. Прошу подтолкнуть к правильному решению. Собссно пока непонятно даже как вообще реализовать сами интерцепторы... ((( Нашел тему: Вопрос по логированию , но ответа на свой вопрос там не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 20:44:32 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
WGA, В итоге в БД складываются записи в виде дерева, отражающего иерархию вызовов. В БД просто кладете логи (аппендером Log4J или как-нибудь еще), добавляете ко всем вызовам логирования новый параметр, скажем так correlation id, operation_id - что-то в этом роде, но основе этого ключа вы должны будете выстроить "иерархию" запросов - при помощи timestamp и этого ключа. Как вариант, имя пользователя системы или номер аккаунта кастомера, или MSISDN или какой-нибудь еще ключ из вашей предметной области, позволяющий УНИКАЛЬНО определить от "чьего" запроса веб-сервиса был совершен вызов EJB и т.д. Можно пробовать помещать какой-нибудь дополнительный сгенерированный ключ в ThreadLocal и потом его доставать. Этот вариант если вызовов от одного кастомера слишком много чтобы выстроить последовательность действий при анализе. Щас местные гуру подтянутся, поправят/дополнят/отвергнут такой подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2012, 07:12:19 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Kostya Ilyinov, Непонятно как передавать текущему "уровню" id родителя, учитывая, что есть методы к remote EJB. Хотя можно иерархию накапливать в отдельном EJB доступного всем прочим. Kostya IlyinovВ БД просто кладете логи (аппендером Log4J или как-нибудь еще), Такая задача тоже есть, но для конечного пользователя надо что-то более читабельное, потому надо самому классификацию записей делать, сообщения прикреплять об результатах операции, классифицировать такие записи. Но в принципе можно такую классификацию сделать на уровнях логгирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2012, 08:06:32 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
WGA, С удаленными EJB думаю только какой-нибудь суррогатный ключ. Подумайте, что в вашей предметной области может таким ключом являться. У нас был мобильный номер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2012, 08:08:43 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Kostya Ilyinov, Как вариант, можно добавить параметр к вызову EJB - но это самый крайний случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2012, 08:09:47 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
WGAKostya Ilyinov, Непонятно как передавать текущему "уровню" id родителя, учитывая, что есть методы к remote EJB. Хотя можно иерархию накапливать в отдельном EJB доступного всем прочим. Можно, но имхо не самый изящный подход. Я бы поискал в параметрах что-либо, что можно использовать для определения родителя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2012, 08:23:28 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Решил задачу с помощью @RequestScoped EJB, доступного всем сервисам. Вроде работает ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 08:00:23 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Поспешил, не работает Подскажите плз можно ли сделать context dependency injection в скоупе request в распределенной системе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2012, 12:40:02 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Kostya IlyinovWGA, С удаленными EJB думаю только какой-нибудь суррогатный ключ. Подумайте, что в вашей предметной области может таким ключом являться. У нас был мобильный номер.Ключа нет. По-крайней мере универсального. Очень разнообразные бизнес-операции.Kostya IlyinovKostya Ilyinov, Как вариант, можно добавить параметр к вызову EJB - но это самый крайний случай.совсем крайний... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2012, 13:38:37 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Можно покрутить какой-нибудь JMSQueueAppender чтобы было технологично. Попробовать при создании логгера использовать Context или метод log(Object message) если таковой есть (я не помню) и толкать туда информацию о контексте дерева. Ну если не хватит то как-то расширить интерфейс и дописать своё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2012, 17:33:36 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
mayton, Если правильно понял, то стандартного способа передачи контекста в вызываемые удаленные EJB нет. А жаль... Для успокоения совести почитаю еще JSR-299, но склоняюсь к тому, что ограничить логгирование одним уровнем, т.е. в веб-сервисах только. Если у кого есть другие идеи то велкам. Спасибо всем кто участвовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2012, 17:59:36 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Не совсем понимаю. EJB больше касается интерфейсов и спецификаций. А логгирование - как напишете так и будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2012, 22:06:53 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
mayton, TCу нужно видеть из EJB кто его позвал. В том числе и из удаленного EJB. Крайний вариант - добавить параметр caller, но это лажа. У нас использовался ThreadLocal, но он на то и ThreadLocal - для удаленных объектов не подходит. P.S. Только сейчас начинаю замечать этакий "каломбур Ржевский (c)" - удаленный в смысле Remote, а не в смысле "отстуствующий" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 03:28:29 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
Публика склоняется что для дистанционных вызовов серебрянной пули нет - либо дополнительные параметры, либо вот такой глобальный HashMap - http://www.hazelcast.com/ Источник: http://stackoverflow.com/questions/10328464/threadlocal-usage-in-enterprise-application ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2012, 03:38:28 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
я, конечно, очень поздно отвечаю, но дайте попробовать... а зачем/почему у вас там remote ejb? наружу выставлены web-services - разверните их на каждой ноде, поставьте перед ними балансировщик, пусть ws получает информацию о вызвавшем и складывает ее в threadlocal (он же ее и очистит после завершения работы), далее пусть ws дергает ejb через local интерфейс (этот ejb дергает другие тоже через local интерфейсы - т.е. в результате запрос обработается полностью на той ноде, на которую его отправил балансировщик). это если я правильно понял задачу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2012, 02:11:59 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
marx_freedomя, конечно, очень поздно отвечаю, но дайте попробовать... а зачем/почему у вас там remote ejb? наружу выставлены web-services - разверните их на каждой ноде, поставьте перед ними балансировщик, пусть ws получает информацию о вызвавшем и складывает ее в threadlocal (он же ее и очистит после завершения работы), далее пусть ws дергает ejb через local интерфейс (этот ejb дергает другие тоже через local интерфейсы - т.е. в результате запрос обработается полностью на той ноде, на которую его отправил балансировщик). это если я правильно понял задачу :)Не поздно, проблема все равно никуда не делась ) Проблема в передаче контекста между разными JVM. В данном конкретном случае что-то наподобие @RequestScoped. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2012, 07:59:52 |
|
||
|
Логирование в распределенных системах
|
|||
|---|---|---|---|
|
#18+
WGAНе поздно, проблема все равно никуда не делась ) Проблема в передаче контекста между разными JVM. В данном конкретном случае что-то наподобие @RequestScoped. Так вот я предлагаю не передавать данные между разными jvm, а обработать все в одной. Т.е. веб-сервис запустить в том же контейнере, что и ejb. В нашем случае так можно, в вашем - не знаю. Типа первое правило распределенных объектов - не распределяйте объекты :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2012, 18:03:07 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37977773&tid=2130693]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 283ms |
| total: | 416ms |

| 0 / 0 |
