我开始使用log4net.async来使用单独的线程进行日志记录,但性能并没有像我最初预期的那样提高,我明白其中的原因是我们记录的一些字符串非常长,因为它们描述收到消息的属性。如何在使用log4net.async时优化log4net调试?
因此,例如,我们可以这样做:
theLogger.Debug(msg.ToString());
当“的ToString()”方法被调用它可以生成一个很长的字符串表示消息,它可能需要一段时间来实际生成它(慢反序列化等)。虽然记录消息对我来说很重要,但我宁愿在单独的线程而不是当前正在运行的线程上“消化”消息,以便我当前正在运行的线程可以继续处理。我将如何让log4net评估“ToString()”结果或在另外的线程上“消化”消息对象?
msg是不可变的(或者至少在这个日志操作排队之后永远不会改变吗?),并且可以安全地用另一个线程以这种方式访问吗? – Servy
@CodeCaster我不认为这个问题是关于如何消除释放模式下的调试调用,并提供'动作'也不会帮助。 OP使用转发appender将消息写入后台线程的文件(所有消息,而不仅仅是调试消息),并且他希望延迟msg.ToSring()的执行,以便它发生在该async转发器的后台线程上。所以它不是特定于调试调用,也不涉及IsDebugEnabled设置,也不涉及条件编译。 –
Evk
@Evk你是对的,我错过了,重新开放。谢谢。我对log4net.async没有任何经验,但是这不会仅仅提前几毫秒提出问题吗?只要另一个线程将日志消息“串化”,其他日志调用将会阻塞,直到该线程再次释放为止。或者有log4net.async内置的某种排队? – CodeCaster