Który wzór jest bardziej odpowiedni do rejestrowania?


10

Powinienem rejestrować niektóre zdarzenia w programie, ale o ile wiem, lepiej byłoby przechowywać kod logowania poza programem, ponieważ nie chodzi o prawdziwą funkcjonalność programu. Czy możesz mi powiedzieć, czy powinienem całkowicie trzymać się z dala od kodu i używać tylko obserwatorów i słuchaczy do rejestrowania zdarzeń? Lub mogę dodać wiersz kodu, taki jak poniżej, gdziekolwiek muszę coś zalogować:

MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99));

Czy popełniam błąd przy użyciu wzorca projektowego Observer? Potrzebuję innego wzoru? Czy powinienem przestać myśleć o wzorach projektowych?

PS1. Jeśli chcę się logować przy użyciu samych detektorów i obserwatorów, z pewnością będę musiał dodać i ulepszyć obserwatorów i detektory programu.

PS2. Z pewnością wiem, że istnieją różne biblioteki do logowania w Javie i używam java.utils.logging, ale muszę mieć opakowanie, aby logować moje obiekty specjalne.


2
Java ma już 17 ram rejestrowania i frameworków meta-logowania (slf4j) i prawdopodobnie jakieś frameworki meta-meta-logowania i żadna z nich nie działa dla Ciebie?
kevin cline

Odpowiedzi:


15

Loggingjest zwykle wdrażany za pomocą wzorca łańcucha odpowiedzialności . Oczywiście możesz (i ja bym) połączyć to z fasadą . Naprawdę nie używałbym samodzielnie Listener (s) lub Observer (s).

Łańcuch odpowiedzialności - Logger


Czy to w zasadzie mówi „napisz do abstrakcyjnego loggera w kodzie”? Wydaje mi się, że moje pytanie brzmi: czy powinienem wyzwalać zdarzenia z miejsca, w którym chcę się zalogować i podać odbiornik, który loguje się w odpowiedzi na zdarzenia, czy powinienem bezpośrednio zadzwonić do mojej usługi Logger (która wewnętrznie korzysta z łańcucha odpowiedzialności) i to wszystko?
Francesco Belladonna,


0

Cóż, Observer wydaje mi się nieodpowiedni. Ponadto podrzucanie wywołań rejestratora „gdziekolwiek potrzebujesz” rozbije kod i naruszy SRP.

Możesz być na przykład zainteresowany AOP, aby móc dołączać wywołania rejestratora za pomocą adnotacji metod.


0

Łańcuch odpowiedzialności wydaje się dobrym wzorcem, gdy twoja produkcja może dotrzeć do wielu miejsc. W UML masz inny rejestrator, który kieruje do konsoli, inny do errorFile i trzeci po prostu rejestrator informacji.

Zwykle widziałem, że logLevels są różne, ale plik rejestrowania jest taki sam.

Nie widzę wzorca obserwatora tak złego przy logowaniu, ponieważ oddziela on kod logowania od kodu aplikacji. Co jest dobrą praktyką, migracja do różnych mechanizmów rejestrowania jest w ten sposób łatwa. Za każdym razem, gdy chcesz się zalogować, uruchom zdarzenie, a odpowiedni słuchacz otrzyma zdarzenie i je zarejestruje. Powinien istnieć pośredni obiekt singletonu, który przechowuje listę wszystkich rejestrów.

W ten sposób widzę, że możemy oddzielić nasz kod logowania od kodu aplikacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.