Logowanie, czy robic to asynchronicznie

0

Witam,
Jak wiadomo logowanie jest przydatne z wielu powodów:

  1. Często klient kłamie i bez dobrych logów nie wiadomo co się stało w systemie.
  2. Łatwiej replikować błędy.
  3. Można ustalić jakie funkcjonalności w systemie nie są wykorzystywane.

Zapisywanie to jest dość czasochłonna operacja (szczególnie zapisywanie do bazy, a zarządzanie logami w plikach to koszmar). Ponieważ jest czasochłonna raczej powinno się to robić asynchronicznie. Pytanie jak najlepiej to zrobić?

Przychodzą mi na myśl następujące scenariusze:

  1. Wystawić kolejkę JMS. MDB czyta logi z kolejki (zdarzeniowo), LogService zapisuje je do kolejki.
    Zalety:
  • zadziała na JEE5
  • zadziała po sieci
    Wady:
  • dość złożone (czy na pewno?)
  • nie zrealizuje tego na WebProfile

Zbudować service zapisujący logi jako usługę EJB. Wykorzystać adnotację @Asynchronous, aby logowanie nie spowalniało logiki biznesowej.

Zalety:

  • prostsze niz MDB
    Wady:
  • wymaga full EJB
  • wymaga JEE6+
  • raczej nie zrealizuje tego na WebProfile
  1. Zastanawiam sie jak wykonac metode asynchroniczna w WebProfile. Czy rzeczywiscie jesli chce miec operacje asynchroniczne musze uzyc pelnego JEE?

  2. Moze sam loger np. SLF4J zadba o asynchroniczne zapisanie logu np. przez JDBC?

Czy moje przepuszczenia sa sluszne czy generalnie przekombinowuje? Pozdrawiam.

1
  1. Wziąć Akkę i zrobić to na aktorach jak bozia przykazała. Niech system będzie działać w ramach LogService, który będzie zwykłym singletonowym beanem. Wystartuj on jednego aktora, który będzie sobie rzeźbił te logi asynchronicznie, bo tak jest to rozwiązane na poziomie architektury.
0

Wydaje mi się że chcesz trochę przekombinować.

Sprawa podstawowa. Sposób logowania jest przyjęty od długiego czasu i działa na wielu platformach. Używając slf4j zrobisz logowanie na aplikacji standalone, spring, jee i pewnie jeszcze czymś. Używając sposobu 1-3 ograniczasz się do jee. Osobiście podszedłbym sceptycznie do takiego przekombinowanego sposobu logowania gdybym trafił do zespołu.

Jedynym sensownym wyjściem jest zrobienie tego w sposób niewidzialny dla użytkownika loggera. Nie wiem czy slf4j ma taki dekorator, chociaż wydaje mi się że to bardzie zależy już od implementacji loggera.

Zauważ też że nie każde użycie funkcji logującej zrobi zapis do miejsca docelowego. Zwykle jest to buforowane i gdy log w pamięci osiągnie sensowny rozmiar, zrzucany jest do bazy/pliku. Ta opcja jest na pewno konfigurowalna.

0

Zauważ też że nie każde użycie funkcji logującej zrobi zapis do miejsca docelowego. Zwykle jest to buforowane i gdy log w pamięci osiągnie sensowny rozmiar, zrzucany jest do bazy/pliku. Ta opcja jest na pewno konfigurowalna.

Dzięki, że o tym wspominasz: póki co zadowole się standardowym SLF4J w aplikacji, którą obecnie rozwijam. Jedynie bolało mnie zapisywanie za każdym razem do bazy.

Polecisz może jakiś materiał do SLF4J?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.