2017-03-29 29 views
1

我开始使用log4net.async来使用单独的线程进行日志记录,但性能并没有像我最初预期的那样提高,我明白其中的原因是我们记录的一些字符串非常长,因为它们描述收到消息的属性。如何在使用log4net.async时优化log4net调试?

因此,例如,我们可以这样做:

theLogger.Debug(msg.ToString()); 

当“的ToString()”方法被调用它可以生成一个很长的字符串表示消息,它可能需要一段时间来实际生成它(慢反序列化等)。虽然记录消息对我来说很重要,但我宁愿在单独的线程而不是当前正在运行的线程上“消化”消息,以便我当前正在运行的线程可以继续处理。我将如何让log4net评估“ToString()”结果或在另外的线程上“消化”消息对象?

+0

msg是不可变的(或者至少在这个日志操作排队之后永远不会改变吗?),并且可以安全地用另一个线程以这种方式访问​​吗? – Servy

+2

@CodeCaster我不认为这个问题是关于如何消除释放模式下的调试调用,并提供'动作'也不会帮助。 OP使用转发appender将消息写入后台线程的文件(所有消息,而不仅仅是调试消息),并且他希望延迟msg.ToSring()的执行,以便它发生在该async转发器的后台线程上。所以它不是特定于调试调用,也不涉及IsDebugEnabled设置,也不涉及条件编译。 – Evk

+0

@Evk你是对的,我错过了,重新开放。谢谢。我对log4net.async没有任何经验,但是这不会仅仅提前几毫秒提出问题吗?只要另一个线程将日志消息“串化”,其他日志调用将会阻塞,直到该线程再次释放为止。或者有log4net.async内置的某种排队? – CodeCaster

回答

1

如果您希望将字符串创建推迟到稍后的时间点(可能在一个单独的线程中),您可以创建一个接受仅在需要时才会调用Func<object, string>的包装器。那个包装器也可以把这个派发给一个单独的线程。

此外,我会建议您对当前的字符串操作执行一些基准测试,并调用Func调用的单独线程的开销。

+0

你知道有没有这样做吗? – Denis

+0

实际上没有,因为我们不直接使用log4net(只能通过'TraceSource')。但是你可以考虑使用'Task'来实现这一点(或者使用并发队列) –