快速提问 - 调查一些吞吐量问题以及我想要勾选的一项是log4net是否登录当前线程?
我们有许多appender,包括dbAppender - 如果日志记录是在当前线程上内联完成的话,那么大量的日志消息会在当前线程上导致大量的db写入。
答案 0 :(得分:2)
是的,它会登录当前线程。一些appender使用缓冲来减少这种影响,但是在某些时候,应用程序线程对日志记录方法的调用将在缓冲数据写入其接收器时阻塞。
已经开始向log4net添加异步appender,但它还没有。
答案 1 :(得分:1)
这实际上取决于使用的appender。 log4net将从每个连接的appender调用append方法,因此这发生在同一个线程中。实现appender AppenderSkeleton
的基类在这些方法中使用(可能不是理想的和推荐的方式)lock(this)
来避免多线程问题。
写入SQL数据库的默认appender是AdoNetAppender
。这个不直接来自骨架。相反,它们之间还有另一个基类。那是BufferingAppenderSkeleton
。这有一个额外的属性BufferSize
,如果达到派生类方法的缓冲区大小,它将仅用于转发数组中的所有缓存日志消息。
AdoNetAppender
仅在达到缓冲区大小时才使用它来调用SQL服务器,这是一个很好的功能,特别是对于客户端/服务器通信,就像我们的SQL案例一样。
因此,对于您来说:如果您使用AdoNetAppender,请更好地将缓冲区大小设置为适合您案例的有意义值,以避免每条消息的网络流量。但是当达到大小时,将阻止调用日志方法的当前方法,直到发送所有消息。
如果您不喜欢这样,那么您应该编写自己的appender,它也派生自BufferingAppenderSkeleton
并且或多或少地复制AdoNetAppender
,但添加他自己的工作线程(或任务)以异步方式发送消息。