- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在寻找一个简单的 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/
是这样的代码: System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(); System.Refle
我正在为 Azure 网站配置诊断和 IIS 日志。Azure 管理门户显示将应用程序诊断存储到 Azure 表存储的选项: 单击“管理表存储”时会弹出一个对话框以提供 Azure 表详细信息: Bl
我正在为 Azure 网站配置诊断和 IIS 日志。Azure 管理门户显示将应用程序诊断存储到 Azure 表存储的选项: 单击“管理表存储”时会弹出一个对话框以提供 Azure 表详细信息: Bl
我计划在我的一个项目中使用 PerformanceCounter。我只知道Microsoft.Diagnostics 。然而我偶然发现了一个相当新的库 Microsoft.Diagnostics.Ev
我正在尝试设置 .NET 跟踪。我可以通过 System.Diagnostics.Trace 进行基本跟踪,但由于复杂的原因,我必须通过 System.Diagnostics.TraceSource
前言 最新一直在忙着项目上的事情,很久没有写博客了,在这里对关注我的粉丝们说声抱歉,后面我可能更多的分享我们在微服务落地的过程中的一些经验。那么今天给大家讲一下在 .NET Core 2 中引入的
我不确定我是否理解 ETW 使用 System.Diagnostics.Tracing 和使用 System.Diagnostics.Trace 之间的主要区别。我知道使用它们我可以将事件转储到一些输
错误:未为<>和System.Diagnostics.Process类型定义运算符System.Diagnostics.Process。 功能错误 Public Shared Function Por
据我了解,System.Console 默认会写入 STDOUT,但是 System.Diagnostics.Trace 和 System.Diagnostics.Debug 呢? ?默认行为是什么,
启动应用程序时,我总是在“诊断工具”窗口中收到错误消息: The diagnostic tools failed unexpectedly. The Diagnostics Hub output in
我正在支持一个大型的旧应用程序。该代码使用 NLog 以及 Debug.WriteLine 和 Trace.WriteLine。我正在尝试将 Debug.WriteLine 和 Trace.Write
请求处理的正常时间范围是多少? 最佳答案 50 毫秒到 500 毫秒之间的任何时间都很好。 这当然只是服务器端。看看Yahoo's Best Practices for Speeding Up You
我已经克隆了 Typescript 存储库并正在查看代码,但它充满了这个错误: Cannot find name 'Diagnostics' 在看起来像这样的行上: Diagnostics._0_ex
我没有找到有关 Trace 和 TraceListener 如何跨多个域工作的信息。 Trace.WriteLine 的调用是跨多个域使用相同的实例,还是在每个域上创建自己的 Trace 类实例? 换
每次我在 Perl 中输入 use diagnostics 时,我都会收到一条错误消息说 couldn't find diagnostics data in /file name.etc... 有人可
为了解决通过不发送电子邮件的smtp服务器发送电子邮件的问题,建议我启用使用System.Diagnosis.TextWriterTraceListener进行日志记录以跟踪与smtp服务器的通信以跟
使用 perl 我几乎总是使用: use strict; use diagnostics; 我建议“使用诊断”而不是 use warnings; here我收到了一些负面反馈。所以,现在我在想: us
我正在研究使用log4net和System.Diagnostics.Trace进行日志记录之间的差异,并且我对观察到的性能差异感到好奇。 我创建了一个测试应用程序,以比较两种情况下这两种日志记录方法的
如何在PowerShell中将Y传递到由System.Diagnostic.Process启动的进程中? function Start-NewPlinkProcess( [string
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我是一名优秀的程序员,十分优秀!