Z pewnością możesz poświęcić dużo czasu na nadmierne zaprojektowanie tego problemu.
W przypadku języków z implementacjami rejestrowania kanonicznego wystarczy utworzyć instancję rejestratora kanonicznego bezpośrednio w każdej klasie.
W przypadku języków bez implementacji kanonicznej spróbuj znaleźć strukturę elewacji rejestrującej i trzymaj się jej. slf4j to dobry wybór w Javie.
Osobiście wolałbym trzymać się jednej konkretnej implementacji rejestrowania i wysyłać wszystko do syslog. Wszystkie dobre narzędzia do analizy dzienników są w stanie połączyć dzienniki sysout z wielu serwerów aplikacji w kompleksowy raport.
Gdy podpis funkcji zawiera jedną lub dwie usługi zależności, a także niektóre „rzeczywiste” argumenty, umieszczam zależności na końcu:
int calculateFooBarSum(int foo, int bar, IntegerSummationService svc)
Ponieważ moje systemy mają zwykle tylko pięć lub mniej takich usług, zawsze upewniam się, że usługi są zawarte w tej samej kolejności we wszystkich podpisach funkcji. Porządek alfabetyczny jest tak dobry, jak każdy inny. (Poza tym: utrzymanie tego metodologicznego podejścia do obsługi muteksów również zmniejszy twoje szanse na zakleszczenie).
Jeśli stwierdzisz, że wstrzykujesz kilkanaście zależności w swojej aplikacji, prawdopodobnie system musi zostać podzielony na osobne podsystemy (czy mogę powiedzieć, że mikrousług?).