我正在尝试使用NLog来记录我们系统中的一些内容。这是一个非常复杂的系统,多线程,在不同的地方有消息队列。
我们需要扩展NLog以我们需要的方式记录其他一些项目。 在扩展NLog之后,我们发现呼叫站点信息是错误的。一些在Stack上搜索给了我一个解决方案。 我现在担心的是,随着我们已经完成的扩展(传递TypeName),我们可以有几百个日志实例,我感觉很难得到这个,但是我会很快得到备份。
我没有看到NLog的dispose方法,所以我不知道垃圾收集会如何解决这个问题。
如果我有100个类,每个运行在不同的线程上,每秒处理1000个事务,并且每个类都记录并创建一个新的日志实例,我将来会看到问题。
我愿意接受建议。请告诉我这是否会成为一个问题,如果是,可能的解决方案?
编辑:添加代码: - 这是ExtenderClass(取类名)
private readonly Logger _logger;
public NLogLogger(Type t)
{
_logger = LogManager.GetLogger(t.FullName);
}
public void Trace(string message, string systemUserID, string transactionID, string description)
{
if (_logger.IsTraceEnabled)
{
Write(LogLevel.Trace, message, systemUserID, transactionID, description);
}
}
这是一个使用它的类: - 这个类将为每个线程任务实例化,所以在忙碌的一天可能会有500个。
public class ThreadTask : TaskBase
{
private readonly NLogLogger _logger = new NLogLogger(typeof(ThreadTask));
public Method(string val)
{
_logger.Trace(message);
}
}
答案 0 :(得分:0)
使用NLog(以及log4net)创建记录器实例的典型模式是在每个类中执行以下操作:
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public void DoSomething()
{
logger.Debug("Hello from inside DoSomething");
}
}
这样,每个类只实例化一个记录器实例(具有如上创建的记录器)。因此,不应该仅仅因为创建了许多类实例而导致创建过多记录器的问题。此外,由于典型模式是使用静态记录器实例,因此记录器将在应用程序的整个生命周期(或可能是AppDomain)中保持有效,因此不需要Dispose。