Регистрация действий пользователя

Клиент хочет, чтобы мы «регистрировали» «действия», которые пользователь выполняет в нашей системе: в основном создание, удаление и обновление. У меня уже есть аспект, который регистрирует трассировку, но он работает на довольно низком уровне, регистрируя каждый вызов метода. Итак, если пользователь нажмет кнопку «открыть медицинскую карту», ​​журнал будет читать:

  1. closePreviousFiles ("нулевой пациент")
  2. createMedicalFile ("нулевой пациент") -> файл № 001
  3. changeStatus ("# 001") -> открыть

а желаемый результат:

  1. открыта медицинская карта № 001 для нулевого пациента

Я думаю об инструменте действий Struts2 с помощью операторов журнала, но мне интересно ... есть ли другой способ сделать это? Я мог бы снова использовать AspectJ (или фильтр) и сохранить логику только в одном месте, чтобы я мог легко настроить журнал, но тогда, боюсь, все станет труднее понять (т.е. «журнал для этого действия неверен. ... где, черт возьми, мне искать проблему? ").

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
3 763
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я недавно обработал журналы, чтобы создать сводку. Вы можете рассмотреть этот подход, особенно если # 2 и # 3 в приведенных выше журналах генерируются в разных местах, и для получения желаемого результата потребуется переносить состояние из одного места в другое.

Фактически, одна из моих основных проблем заключается в том, что для сохранения логики ведения журнала в одном месте потребуется передать сеанс и любой заданный набор параметров ... постобработка - действительно интересный вариант!

Manrico Corazzi 24.12.2008 14:41

Рад, что смог быть полезным. Я немного не решался писать, зная очень мало или совсем ничего о Struts и AspectJ :-)

Miserable Variable 24.12.2008 15:16

Если вы работаете с медицинскими данными, вы можете рассмотреть возможность ведения журнала и управления версиями. Я бы даже подумал об этом с триггерами базы данных. Я не очень много занимаюсь программированием на Java, но я обсуждал именно эту проблему с нашей командой по информационной системе для учащихся. Они используют Oracle на сервере и регистрируют переменную сеанса в своих соединениях. Их триггеры используют эту переменную сеанса для создания записей журнала и историй версий (при обновлении / удалении) критических таблиц. Это дает им возможности как для аудита, так и для отката. Я думаю, что и то, и другое было бы полезно для приложения с медицинскими записями.

Они также используют log4j для ведения журнала на уровне приложений, но запись данных происходит в базе данных.

Я уже веду журналы медицинских данных с помощью универсального класса, который сохраняет «различия» между множеством разных записей; это делается с помощью специального разреженного кода. Тем не менее, наши клиенты хотели бы регистрировать другие данные (например, административные операции, такие как создание и обновление пользователей / групп).

Manrico Corazzi 24.12.2008 17:16
Ответ принят как подходящий

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

Учтите, что в каждой точке входа действия (из веб-запроса) необходимо запустить запись аудита с перечислением / константой действия. Если возможно, заполните его информацией, предоставленной пользователем.

При выходе / окончании укажите в аудите, успешный он или нет. Пример в псевдокоде:

enum Actions {
  OPEN_MEDICAL_FILE
  ...
}

void handleRequest(...) {
  String patient = ...;
  Audit audit = new Audit(OPEN_MEDICAL_FILE);
  audit.addParameter("patient", patient);
  try {
     ... more things ..
     audit.addParameter("file", "#001");
     ... more things ...
     audit.setSuccess();
  } finally {
    audit.save();
  }
}

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

Поскольку мы регистрируем константы действий и данные, представление аудита клиенту может быть закодировано отдельно. Вы также получаете гибкость, поскольку изменение строки представления (например, «открытая медицинская карта № 001 для нулевого пациента» на «открытая медицинская карта пациента № 001) определяется не во время действия, а позже. нет необходимости повторно передавать данные аудита.

Я делал то же самое в действиях Struts2, я использовал "log4j". В зависимости от вашего сервера приложений он может иметь интегрированную систему ведения журнала, позволяющую использовать каталоги сообщений (например, Weblogic).

Другие вопросы по теме