patterncsharpMajor
Logging without Code Bloat
Viewed 0 times
codeloggingwithoutbloat
Problem
I was wondering if any of you know any best practices or design patterns so that I can have good logging in my programs without them looking messy or bloated.
I am currently using C# and NLog, however I guess any advice here would be language and tool agnostic.
The problem we have is that we want to have good logging, however we can't seem to find a way around having many lines which just log operations, which can turn a simple method like this:
Into something which looks like this:
Here we now have more logging lines than code lines.
However I am being told by operations that this level of logging is required, and at the moment is still too coarse.
Is there any way around this ugly manual logging, or am I stuck with it?
I am currently using C# and NLog, however I guess any advice here would be language and tool agnostic.
The problem we have is that we want to have good logging, however we can't seem to find a way around having many lines which just log operations, which can turn a simple method like this:
void Foo()
{
Bar bar = dbContext().Bars.First();
bool someCondition = bar.DoSomething();
if (someContition)
{
dbContext().FooBars.Add(new FooBar());
}
}Into something which looks like this:
void Foo()
{
_logger.Info("Getting first bar from database...");
Bar bar = dbContext().Bars.First();
_logger.Info("First bar returned from database, id = {0}", bar.Id);
_logger.Info("Doing something on bar with id = {0}", bar.Id);
bool someCondition = bar.DoSomething();
_logger.Info("Something done on bar with id = {0}, response = {1}", bar.Id, someCondition);
if (someContition)
{
_logger.Warn("Adding new FooBar to database");
dbContext().FooBars.Add(new FooBar());
_logger.Warn("Added new FooBar to database successfully");
}
}Here we now have more logging lines than code lines.
However I am being told by operations that this level of logging is required, and at the moment is still too coarse.
Is there any way around this ugly manual logging, or am I stuck with it?
Solution
This kind of trace logging could conceivably be solved with an Aspect.
Aspect oriented programming allows you to add boilerplate-style code to your program without actually writing the boilerplate inline. You could, for example, add an aspect than logged a method name and parameters every time a program entered a method, and then logged the method name and return value every time a method returned.
Of course, you don't necessarily want to log every method. Instead, most aspect frameworks allow you to indicate which code you want the boilerplate added to.
I don't know enough about C# to recommend a specific aspect-oriented framework to use, or appropriate syntax for you. Sorry.
Aspect oriented programming allows you to add boilerplate-style code to your program without actually writing the boilerplate inline. You could, for example, add an aspect than logged a method name and parameters every time a program entered a method, and then logged the method name and return value every time a method returned.
Of course, you don't necessarily want to log every method. Instead, most aspect frameworks allow you to indicate which code you want the boilerplate added to.
I don't know enough about C# to recommend a specific aspect-oriented framework to use, or appropriate syntax for you. Sorry.
Context
StackExchange Code Review Q#45193, answer score: 30
Revisions (0)
No revisions yet.