You can definitely spend a lot of time over-engineering this problem.
For languages with canonical logging implementations, just instantiate the canonical logger directly in every class.
For languages without a canonical implementation, try to find a logging facade framework and stick to it. slf4j is a good choice in Java.
Personally I'd rather stick to a single concrete logging implementation and send everything to syslog. All the good log analysis tools are capable of combining sysout logs from multiple app servers into a comprehensive report.
When a function signature includes one or two dependency services as well as some "real" arguments, I place the dependencies last:
int calculateFooBarSum(int foo, int bar, IntegerSummationService svc)
Since my systems tend to only have five or fewer such services, I always make sure the services are included in the same order across all function signatures. Alphabetical order is as good as any. (Aside: maintaining this methodological approach for mutex handling will also reduce your chances of developing deadlocks.)
If you find yourself injecting more than a dozen or so dependencies across your app, then the system probably needs to be split up into separate subsystems (dare I say microservices?).