log4net memoryappender内存不足

时间:2017-01-05 12:31:22

标签: c# out-of-memory log4net

我使用log4net和memoryappender。 当我尝试读取变量的所有行(这里:StringBuilder)时,当行数量很高时,我得到一个OutOfMemory-Exception。我用1mio线测试了它:

public class RenderingMemoryAppender : MemoryAppender
{
    public IEnumerable<string> GetRenderedEvents(List<Level> levelList = null)
    {
        foreach (var loggingEvent in GetEvents())
        {
            yield return RenderLoggingEvent(loggingEvent);
        }
    }

    public byte[] GetEventsAsByteArray(List<Level> levelList=null )
    {
        var events = GetRenderedEvents(levelList);
        var s = new StringBuilder();
        foreach (var e in events)
        {
            s.Append(e);
        }
        //the exception is thrown here below when calling s.ToString().
        return Encoding.UTF8.GetBytes(s.ToString());
    }
}

当我简单地将一百万行添加到没有log4net组件的stringbuilder时,一切正常......

我也尝试过这个:

var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);

foreach (var loggingEvent in GetEvents())
{
    stringBuilder.Clear();
    loggingEvent.WriteRenderedMessage(stringWriter);

    list.Add(stringBuilder.ToString());
}

但这也没有用。

1 个答案:

答案 0 :(得分:0)

如果你想在内存中包含那么多行,运行时想要分配一段可以包含整个字符串的内存。如果不可能,因为在那一刻,抛出了OutOfMemory异常。如果你需要来自内存流的字节,那么在内存流上调用ToArray()方法会更有效,这也会因为ToString方法在StringBuilder上失败的原因而失败。您可以检查是否以64位模式运行,如果没有,它可以帮助获得更多的地址空间。我建议重新考虑你的日志记录方法。你现在这样做的方式是不可靠的,甚至可能会破坏你的程序。