如何在不违反实体原则的情况下正确实施日志?

时间:2013-09-24 13:13:15

标签: logging log4net nlog

我正在尝试通过NLog实现日志记录,并且有一些代码气味确实引起我的注意,但目前由于我的知识有限,我不知道如何处理它们。

以下是我不喜欢的事情

首先,我将NLog的实际实现隐藏在一个与DI一起使用的接口后面,该类是一个单例。

目前我正在尝试记录尽可能多的信息,这意味着我从业务对象中的几乎每个方法调用记录器,并且我不喜欢我在Logging类上创建的依赖项。他们有更好的方法从每个方法进行记录而不是直接调用方法吗?在这里,我相信我违反了Open Closed Principal,因为如果我在日志记录界面方法中进行更改。所有地狱都会破裂,这种变化几乎会在每种方法中都会出现波动。

其次更可怕的部分是我需要在某些情况下将一些额外的信息传递给我的记录器,例如UserID,ProductCode等。如果我将这些信息作为参数传递给记录器类,我甚至不想记下来那条路...更有经验的人如何处理这些情景?

请提供反馈意见!

2 个答案:

答案 0 :(得分:3)

您应该尝试使用Aspects进行日志记录。请参阅http://www.voelter.de/data/articles/aop/aop.html或只是google“使用方面进行日志记录”

答案 1 :(得分:1)

您可以通用方式设计业务对象的内置日志记录,其中记录器可以附加到对象以接收记录事件。这样,您可以稍后更改记录日志的方法,而无需更改业务对象代码。

类似的东西:

public interface BOLogger
{
    void Log(string message);
}

public sealed class AbstractBOLogger : BOLogger
{
    public List<BOLogger> Loggers { get; private set; }

    public AbstractBOLogger
    {
        this.Loggers = new List<BOLogger>();
    }

    public void Log(string message)
    {
        this.Loggers.ForEach(logger => logger.Log(message));
    }
}

public class BusinessObject
{
    public BOLogger { get; private set; }

    public BusinessObject
    {
        this.BOLogger = new AbstractBOLogger();
    }
}

无论如何都是这样的。