gpt4 book ai didi

c# - System.Diagnostics.Trace 是否有任何性能下降?

转载 作者:太空狗 更新时间:2023-10-29 20:13:11 25 4
gpt4 key购买 nike

我正在寻找一个简单的 native .NET 错误记录解决方案。我对使用 log4net、Elmah 或任何其他日志记录库不感兴趣。以下是我计划使用的内容。我的问题是我网站的性能是最重要的,这个流程是否会带来任何性能问题?

全局.asax

protected void Application_Start(object sender, EventArgs e)
{
GlobalFilters.Filters.Add(new HandleExceptionsAttribute());
}

处理异常属性:

public sealed class HandleExceptionsAttribute : HandleErrorAttribute
{
private void TraceError(Exception _this)
{
Trace.TraceError("{0} Exception {1}", DateTime.Now.ToString("M/d/yyyy h:mmtt"), _this);
}

public override void OnException(ExceptionContext filterContext)
{
var ex = filterContext.Exception;
TraceError(ex);
Task.Run(() =>
{
using (var msg = new MailMessage(ConfigurationManager.AppSettings["SendErrorsFrom"], ConfigurationManager.AppSettings["SendErrorsTo"]))
{
msg.Subject = ex.Message;
msg.Body = ex.StackTrace;
using (var smtp = new SmtpClient())
smtp.Send(msg);
}
});
}
}

网络配置:

  <system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="textWriterListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="logs\log.txt"/>
<add name="eventLogListener" type="System.Diagnostics.EventLogTraceListener" initializeData="Base Test" />
<remove name="Default"/>
</listeners>
</trace>
</system.diagnostics>

最佳答案

为每个异常获取电子邮件?祝你好运。

目前的代码将无法正常工作。这与 Trace.TraceError 本身无关,而是你想做什么。我有时会看到错误循环会在几分钟内产生数百万个异常。您正在努力进行 self 造成的拒绝服务攻击。让我们做一些数学运算。每分钟 100 万个异常,文本 blob 为 ca。 1500 字节的网络导致 1.5GB/分钟的邮件数据。这会吃大约。 25 MBit 的网络带宽。这是一个保守的估计。但如果发生这种情况,您将很快耗尽内存。异步任务方法将任务排队。由于发送电子邮件的速度比产生异常的速度慢,因此您很快就会收到 OutOfMemoryException,您也将尝试通过邮件发送该异常……至少在拒绝服务情况持续存在之前,您将很快获得免费重启。

更好的方法是编写自定义 MailTraceListener,它将聚合异常并限制每封邮件的发送异常率,例如至多 1/分钟。然后您可以添加一个 RollingFileTraceListener(不是 .NET 的一部分。存在外部日志记录库是有原因的),它将记录到一个平面文件,您可以通过邮件发送汇总摘要。通过异常消息检测重复异常以仅记录摘要也是有意义的。例如。第一个总是记录下来,然后你再次检查最后一个异常是否与新异常相同。如果是,增加一个计数器并继续这样做,直到出现另一个计数器。然后你可以写一个很好的总结,说刚刚发生了 100 亿个异常,除了第一个之外,你没有记录任何异常。

异常本身很慢。如果您跟踪或不跟踪它们,则没有任何作用。您可以优化掉 Trace 调用,但这是您最不关心的问题。堆栈展开是异常处理中最昂贵的部分。跟踪的主要性能影响来自您配置的输出设备。如果您对其进行剖析,您会很快发现这一点。

正如我在上面概述的那样,一个好的错误处理策略并不容易实现,因为您要处理几乎任何事情都可能发生的异常情况。包括您对异常的处理成为问题的一部分。您需要彻底测试它,否则您会发现如果没有错误发生,它可以完美运行,但由于某些奇怪的原因,当出现某些特殊情况异常时它会崩溃。

关于c# - System.Diagnostics.Trace 是否有任何性能下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com