C# log4net内存出现内存不足
我用的是log4net和一个memoryappender。 当我尝试读取一个变量的所有行(这里是:StringBuilder)时,当行数太多时,我会得到一个OutOfMemory异常。我用1mio线测试过: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)
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());
}