【问题标题】:How to implement logging properly without violating solid principals?如何在不违反可靠原则的情况下正确实现日志记录?
【发布时间】:2013-09-24 13:13:15
【问题描述】:

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

以下是我不喜欢的东西

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

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

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

请提供您的反馈!

【问题讨论】:

    标签: logging log4net nlog


    【解决方案1】:

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

    【讨论】:

    • 感谢雷,您的回答使我朝着正确的方向前进。我在我的案例中使用了 Post Sharp,现在必须说我与 Cross Cut Concerns 合作的观点已经完全改变了!谢谢队友!
    • 是的,横切是一种全新的思维方式。玩得开心。
    【解决方案2】:

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

    类似:

    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();
        }
    }
    

    反正就是这样。

    【讨论】:

    • 感谢您的评论。这正是我现在正在做的,但这正是我不想做的。请参阅此处,您依赖于 Business 对象中的 AbstractBlogger 类。假设您有 500 个业务对象,并且所有这些对象都需要日志记录,因此您将在任何地方添加对记录器的依赖关系,以后如果您更改记录器中的某些内容,您将需要接触业务对象。那不是 SOLID 代码。我选择了 Ray Trask 提供的建议。我继续使用 PostSharp,我现在对我的实现非常满意谢谢 4 的输入 :)
    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2018-06-16
    相关资源
    最近更新 更多