Puoi sicuramente dedicare molto tempo a sovrastimolare questo problema.
Per le lingue con implementazioni di registrazione canoniche, basta istanziare il logger canonico direttamente in ogni classe.
Per le lingue senza un'implementazione canonica, prova a trovare un framework per la facciata del logging e ad attenervisi. slf4j è una buona scelta in Java.
Personalmente preferisco attenermi a una singola implementazione di registrazione concreta e inviare tutto a syslog. Tutti i buoni strumenti di analisi dei registri sono in grado di combinare i registri di sysout da più server di app in un rapporto completo.
Quando una firma di funzione include uno o due servizi di dipendenza oltre ad alcuni argomenti "reali", inserisco le dipendenze per ultime:
int calculateFooBarSum(int foo, int bar, IntegerSummationService svc)
Poiché i miei sistemi tendono ad avere solo cinque o meno tali servizi, io semper assicuri che i servizi siano inclusi nello stesso ordine in tutte le firme di funzioni. L'ordine alfabetico è buono come qualsiasi. (A parte questo, mantenere questo approccio metodologico per la gestione dei mutex ridurrà anche le possibilità di sviluppare deadlock.)
Se ti ritrovi a iniettare più di una dozzina di dipendenze nella tua app, allora il sistema probabilmente deve essere suddiviso in sottosistemi separati (oserei dire microservizi?).