C# log4net内存出现内存不足

C# log4net内存出现内存不足,c#,out-of-memory,log4net,C#,Out Of Memory,Log4net,我用的是log4net和一个memoryappender。 当我尝试读取一个变量的所有行(这里是:StringBuilder)时,当行数太多时,我会得到一个OutOfMemory异常。我用1mio线测试过: public class RenderingMemoryAppender : MemoryAppender { public IEnumerable<string> GetRenderedEvents(List<Level> levelList = null)

我用的是log4net和一个memoryappender。 当我尝试读取一个变量的所有行(这里是:StringBuilder)时,当行数太多时,我会得到一个OutOfMemory异常。我用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());
    }
}

但是这也不起作用。

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

可能重复的
var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);

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

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