【问题标题】:Log4Net and memory consumptionLog4Net 和内存消耗
【发布时间】:2011-01-15 19:36:54
【问题描述】:

我看到 LogNet 通常使用静态变量进行实例化:

 static logger = LogManager.GetLogger(frame.GetMethod().DeclaringType);

愚蠢的问题,但是:

1) 这不是有点烦人吗 --- 即。我必须在我的代码的每个日志记录片段中都有这个混乱的调用。

2) 这不会产生大量的内存开销 --- 即。我的每一个类都将与一个单独的日志记录类相关联。 300 个使用日志的类会强制使用 300 个日志静态变量?看起来很奇怪。

【问题讨论】:

  • 不是几百个小物件那么贵...
  • 嗯,从编码的角度来看,这似乎仍然很痛苦……例如,我必须记住每次都将记录器实例化为“静态”。如果我忘记了这一点,那么我会受到性能惩罚。是否有技巧可以避免或简化此问题?
  • 不确定,但如果使用相同的参数调用,GetLogger() 方法可能应该返回相同的记录器。因此,如果您有 300 个类的实例,则应该为所有这些实例使用一个记录器。

标签: c# asp.net memory-management log4net


【解决方案1】:

log4net 维护一个记录器存储库,您无需将它们设为静态。每个类都有一个命名记录器是推荐的方式,您不必担心在内存中有几百个记录器的“开销”。如果这是一个问题,您可能需要完全删除日志记录。

日志记录很混乱,即它会使您的代码杂乱无章,而这些东西并不是真正属于业务的一部分。面向方面的编程可能会对您有所帮助there

【讨论】:

    【解决方案2】:

    您不需要/必须使用静态变量。通常我的课程看起来像

    public class Foo
    {
       private ILog Logger;
    
       public Foo()
       {
           Logger = LogManager.GetLogger(GetType());
       }
    
       //rest of class here
    
     }
    

    这是相当干净的,在我遇到内存问题之前,尽早优化应用程序的内存使用是没有意义的。然而,并不是我所有的类都执行日志记录,所以只有那些做/需要的类才会有这段代码。如果您的每个班级都在记录,那么听起来您可能正在过度记录,或者您正在处理一个相当大的应用程序(基于您有 300 个班级写入日志的事实)。如果是后者,那么 300 个日志记录类实例可能不会占内存使用量的很大一部分。

    您可以选择将记录器设置为命名实例ILog Logger = LogManager.GetLogger("MyNamedLogger");,并在多个类中使用这个“命名”ILog 实例。请注意,由于通常写出日志消息的方式,您将失去一些已记录消息的有用性。您当然可以通过几种不同的方式来弥补这一点。

    【讨论】:

    • -1 用于非静态建议(保留相同数量的连线代码),+1 用于提及命名实例;)
    • @KenHenderson:不需要像 StefanEgli 在他的回答中指出的那样使用静态。 Log4Net 有一个命名记录器池。
    • @Askolein - 我的第一行提到您不需要静态变量。您能否告诉我答案的哪一部分提到/暗示了静态的使用,以便我可以更新它以正确反映我的答案的意图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多