2010-02-02 88 views

回答

18

结帐BufferingForwardingAppender。我们使用这个转发到RollingFileAppender。它批量写入并允许代码在不等待写入的情况下继续。我们设置了一个评估器来强制在WARN阈值处刷新并将有效值设置为false,以便我们不会错过任何消息。

<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender"> 
    <bufferSize value="512" /> 
    <lossy value="false" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="WARN"/> 
    </evaluator> 
    <appender-ref ref="RollingFileAppender" /> 
</appender> 
+0

非常好的主意。还没有尝试过,但我会有一段时间。 – 2012-03-08 16:11:35

+2

正是我不知道我在找什么。 – ctrlplusb 2012-09-02 16:01:39

+0

我已经在一个简单的Web项目中测试了这个,并且(令人惊讶的)可伸缩性没有提高,反而更糟糕。 **测试**:每个请求20个日志行500个请求/ 50个用户。 **结果**:无日志记录:278请求/秒,滚动文件附加程序:129请求/秒,使用滚动文件缓冲转发:76请求/秒。 – tozevv 2013-10-01 14:50:00

5

你可以写一个log4net的等效NullAppender,这将是非常快......(很抱歉 - 我本来以为这个问题是关于log4j的;同样的建议也适用不过。)

当然,这止跌”不要做任何有用的事情 - 这让我想知道为什么你对速度非常重视。正常的方法是找出你需要的东西,然后对它进行基准测试,以检查它是否充分发挥作用。我怀疑,在实际上成为瓶颈之前,你会被更多的数据淹没,而不是有用的处理。记录有没有已知的性能问题?

+0

没有性能问题与日志记录无关,但总的来说,我正在研究提高应用程序的性能,并添加了log4Net以在运行时对其进行分析。由于应用程序已经很慢,我不希望这会造成太大的开销。所以我正在寻找最快的appender。 – Amitabh 2010-02-02 14:41:35

+1

@Amitabh:如果应用程序已经很慢,那意味着日志记录甚至*少*可能会产生重大影响。真的,使用你最容易记录的东西,然后只用合理的记录。这可能是提高应用程序整体速度的最快捷方式。 – 2010-02-02 14:52:15

+0

我会补充说,有时候这个问题并不是缓慢的日志记录,而是如何入侵。例如,如果您从多个线程进行日志记录,那么日志记录的行为可能会导致它们同步,这会抛出您想要测量的内容。通常的答案是登录到一个队列中,该队列在单个线程中处理。 – 2010-02-02 15:02:14

0

你应该考虑

  1. 写入文件比写安慰
  2. 我猜你的问题出在生产前快得多(ceating日志数据,然后不使用它) 使用log.canLog确保您可以在创建数据之前进行登录(这通常是大时间消费者)
  3. 检查您没有使用像用户当前凭证等耗时的各种字段。 。