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.

użytkownik1892555
źródło
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

Elliott Frisch
źródło
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,
8

Użyj programowania zorientowanego na aspekty, w którym stosuje się porady After, Before i Around dotyczące metod. Tam, zgodnie z potrzebami, możesz dodać dzienniki przed uruchomieniem interfejsu API, po lub pod pewnymi warunkami, a także oddzielić kod główny od kodu logowania.

Yogesh Patil
źródło
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.

Powerslave
źródło
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.

użytkownik2922188
źródło