Вы можете определенно потратить много времени на решение этой проблемы.
Для языков с реализациями канонического журналирования просто создайте экземпляр канонического регистратора непосредственно в каждом классе.
Для языков без канонической реализации, попробуйте найти каркас фасада регистрации и придерживаться его. slf4j - хороший выбор в Java.
Лично я предпочел бы придерживаться одной конкретной реализации регистрации и отправить все в системный журнал. Все хорошие инструменты анализа журналов способны объединять журналы sysout с нескольких серверов приложений в единый отчет.
Когда сигнатура функции включает в себя одну или две службы зависимостей, а также некоторые «реальные» аргументы, я ставлю зависимости в последнюю очередь:
int calculateFooBarSum(int foo, int bar, IntegerSummationService svc)
Поскольку мои системы обычно имеют только пять или менее таких служб, я всегда проверяю, чтобы службы были включены в один и тот же порядок для всех сигнатур функций. Алфавитный порядок так же хорош, как и любой. (Кроме того: поддержание этого методологического подхода для обработки мьютексов также снизит ваши шансы на развитие взаимоблокировок.)
Если вы обнаружите, что внедряете в свое приложение более дюжины или около того зависимостей, то систему, вероятно, нужно разделить на отдельные подсистемы (смею сказать, микросервисы?).