Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How should I architect logging within my application?

So I've done a lot of research on this and haven't found any answers where I said, "yes, THAT". I'm hoping the ever-erudite StackOverflow crowd can help me out.

I've run into this issue in a couple of different scenarios. Say I have a C# app, and there are important things that I want to log.

public class MyClass
{
    ... 

    public void ImportantMethod()
    {
        DoInterestingThing();

        var result = SomethingElseImportant();
        if (result == null)
        {
            logger.Log("I wasn't expecting that. No biggie.");
            return;
        }

        MoreInterestingStuff(); 
}

The thing I'm interested in is where do I get logger from.

As I see it I have a few options.

  1. Have it injected into MyClass in the constructor.
  2. Retrieve it using a globally available service locator.
  3. Use method decorators and AOP to have my logging done for me.

None of these seem like great options. #3 looks to be impossible since I'm logging right in the middle of my business logic and not just doing a simple trace of my method calls, input parameters and/or exceptions thrown. #2, though simple seems like it would be really difficult to unit test. Of course, I would want to unit test everything. #1, though it would work fine, clutters up all my business logic with logging objects that have nothing to do with the business objects themselves.

Any alternative ideas, or thoughts on one of the options above? Much thanks!

EDIT: just to be clear, I already know how to do DI (I use Unity), and I already know a good logging framework (I use log4net). Just wondering a how to use logging in an architecture sense across an application in the smartest way.


* EDIT *

I marked Mark Seeman's answer as the solution. I went through my application and found that most of my logging calls were doing the same thing a decorator could do. Namely, log the entry to the method, any exceptions thrown, and exit return values.

Some cases I still needed to log directly inside a method. An example would be where I want to fail fast in a method which doesn't return anything but not throw an Exception. In those cases I have a singleton which holds a reference a LogProvider which will in turn retrieve a named log instance. The code looks similar to this:

private ILog logger = LogProviderFactory.Instance.GetLogger(typeof(Foo));

LogProviderFactory has a method SetProvider which allows you to swap out the singleton. So in unit testing I can do:

// LogProviderFactory.Instance now is our mock
LogProviderFactory.SetProvider(MockLogProvider);

The logging decorator uses the same LogProvider as the singleton (which it obtains through injection), so logging is unified throughout the system.

So really the end solution was mostly option #3, and a hybrid #2 (where it's the service locator pattern but the service is 'injected' into the locator).

AOP

As far as "aspect oriented programming" goes, I was a bit disappointed in the limitations of the language. Hoping AOP will be treated as a first-class citizen in future releases.

  • I tried PostSharp but couldn't get it running on my machine correctly. Additionally it was a big restriction that you had to have PostSharp installed on your system to use it (as opposed to just calling a dll which comes with the solution or something similar).
  • I used LinFu and was able to get it partially working. It blew up in a few instances however. The new 2.0 release is barely documented, so that was a hurdle.
  • Interface interception with Unity however seems to work well out of the box. I got lucky that most things I wanted to log were in classes implementing interfaces.
like image 346
JonH Avatar asked Jul 14 '11 23:07

JonH


People also ask

Why is logging architecture important?

Join the DZone community and get the full member experience. Logging architecture is an important part of application health and performance monitoring in the modern distributed application architecture world.

What do application logs tell us?

Application developers tend to rely on application logging to troubleshoot and diagnose a variety of issues. The application logs do not tell the whole story as to why something went wrong or to determine the cause. There are a wide variety of logging solutions that scatter various files across a server.

What are the best application logging practices?

Here is a list of 5 best application logging practices one must be aware of: A logging framework is a tool that helps you standardize the logging process in your application. A third-party tool, such as log4net or log4j, can help with this.

What is a logging framework?

A logging framework is a tool that helps you standardize the logging process in your application. A third-party tool, such as log4net or log4j, can help with this. To be more explicit, a logging system may be imagined as encompassing three key concerns: recording, formatting, and adding.


1 Answers

Use a logging Decorator.

like image 119
Mark Seemann Avatar answered Sep 20 '22 13:09

Mark Seemann