I am aware that logging is a cross cutting concern and I normally use AOP for logging any errors or exceptions in general. However I am facing a scenario where we also have to log specific information about various operations performed, like for example when an operation was successful we have to log that also, we also have to log something if the response from a web service is invalid according to our business rules etc etc. This means that in some scenarios, logging an event becomes specifically part of the business flow and in these specific cases it is not a cross cutting concern.
To handle such scenarios I have made a DBLogger class that simply writes some dynamic messages and error codes to the DB.
Currently I am using the DBLogger class via dependency injection from ILogger interface. When I look at my code it seems like a code smell to me to see that I am injecting this class in every class where I need to log business rules violation. I am considering making the DBLogger class static and using it directly instead of injecting it. This will remove the code clutter a little bit and my constructor will be clean but the dependency will be still there.
My question is what is the recommended way and best practice to handle such scenarios, and how can OOP and design patterns come to rescue in this case to stop me from violating the Open Closed Principal?