2017-08-09 55 views
0

快速问题 - 调查一些吞吐量问题,我想勾选一个项目是log4net是否登录当前线程?log4net是否登录当前线程?

我们有许多附加目的地包括dbAppender的 - 如果日志记录在当前线程上内嵌做到,那么日志消息的显著量会导致很多分贝写在当前线程..

+2

从来没有想过,但我不明白为什么它不应该?它通常是线程安全的,是的,日志会影响性能....我依稀记得,你可以配置一些缓冲,但... – Fildor

回答

1

那真的取决于使用的appender。 log4net将只调用每个连接的appender的append方法,所以这发生在同一个线程内。实现appender AppenderSkeleton的基类在这些方法中使用(可能不是理想的和推荐的方式)lock(this)以避免多线程问题。

写入SQL数据库的默认appender是AdoNetAppender。这个不是直接从骨架中派生出来的。相反,它们之间有之间的另一个基类。那是BufferingAppenderSkeleton。这有一个额外的属性BufferSize,如果缓冲区大小达到派生类的方法,它将用于只转发数组中所有缓存的日志消息。

这被AdoNetAppender用来调用SQL服务器,只有当达到缓冲区大小,并且是一个很好的功能,特别是像我们的SQL情况下的客户端/服务器通信。

所以,对于您的部分:如果您使用AdoNetAppender,最好将缓冲区大小设置为您的情况的一些有意义的值,以避免每条消息的网络流量。但是,当达到大小时,当前方法称为日志方法将被阻止,直到所有消息发送。

如果你不喜欢那样,你应该编写自己的appender,这也衍生自BufferingAppenderSkeleton或多或少地复制AdoNetAppender,但添加他自己的工作线程(或任务),异步发送消息。

+0

这真的很棒。谢谢奥利弗。 –

+0

我要试用这个小伙子的一些异步appender的实现 - https://github.com/cjbhaines/Log4Net.Async它似乎很受欢迎 –

2

是的,它会登录当前线程。一些appender使用缓冲来减少这种影响,但在某些时候,应用程序线程对日志记录方法的调用会在缓冲数据写入其接收器时被阻塞。

已经有一些步骤将异步appender添加到log4net,但目前还没有。