Log4Net和内存消耗

时间:2011-01-15 19:36:55

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

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

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

愚蠢的问题,但是:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

public class Foo
{
   private ILog Logger;

   public Foo()
   {
       Logger = LogManager.GetLogger(GetType());
   }

   //rest of class here

 }

这是相当干净的,直到我遇到内存问题,早期优化应用程序的内存使用是没有意义的。然而,并非所有类都执行日志记录,因此只有那些需要执行/需要的类才能使用这些代码。如果你的每个类都在记录,那么听起来你可能会过度记录,或者你正在处理一个相当大的应用程序(基于你有300个类写入日志的事实)。如果是后一种情况,那么300个日志记录类实例可能不是内存使用量足迹的重要部分。

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