我们希望将错误反馈添加到应用程序中。我看了一下现有的解决方案(例如raygun.io),但是这些工作“在云中”,对我们来说是不行的:
现在,仅仅记录这些异常并不难。我已经将处理程序附加到AppDomain.UnhandledException和AppDomain.FirstChanceException,然后将它们写到一个小型SQLite DB中。
但我的问题是如何最好地分析它们。用手分析它们会花费太多的时间,所以我们至少需要能够将它们分成“水桶”,并按次数排序,等等。
我确实有一些想法,在这里,我比较了老套和消息,等等,但我觉得其他人一定已经做了同样的事情。
你知道对例外进行分类和分组的好策略吗?
发布于 2015-06-21 18:04:36
收集异常时,要注意两件事:
当涉及到敏感数据时,请确保在将异常发送到第三方服务器(甚至您的服务器)时对它们进行加密,以防止访问堆栈跟踪到未经授权的人员。确保开发人员永远不要在异常消息中包含敏感信息。例如,AccessDeniedException不应该有消息:
验证用户John失败:密码"sihjdfogdhf“无效。
在您收集的信息中,请确保您拥有:
最重要的一步是去复制您收集的异常信息。许多例外将是相似的,但不是完全相同的:关键是要确定它们有多近,并将它们分组。目标是能够将重点放在最常见的异常上:如果一个异常在过去一年中影响了一个用户两次,而一个异常在同一时期内影响了数千名用户,那么第一个异常可能不是您的首要任务。
您可能不会从零开始进行分组;相反,研究您已经收集到的异常,尝试一种分组方法,看看它是如何工作的,然后修改它,直到您得到所需的。分组是很棘手的,因为实际上没有绝对的重复,因为使它成为复制的东西和不复制的东西之间的差距是模糊的。
例如:
AccessDeniedExceptions报告在登录窗口按钮OnClick事件,一个有关约翰,另一个有关玛丽,这些可以分组,尽管不同的消息字符串。AccessDeniedException,它发生在应用程序的其他地方,不应该与前两个分类。AccessDeniedException:堆栈跟踪是不同的,但异常仍然与前两个相同。分组时,请确保您也保留了个人信息。例如,报告可能告诉我们,在过去的一天里,在4.0.17和4.0.18版本中,用户John、Mary和其他14个人被抛出94次AccessDeniedExceptions,客户给出的堆栈跟踪由1、2、3和4提供。
发布于 2015-06-21 12:45:27
对此,我没有详细的解决方案,但我的方法是生成捕获的异常的子类,并存储+分析并实现一些有关异常类型的信息。
public enum ExceptionDanger
{
Low,
Middle,
SecurityCritical
// And so on
}现在,我们将其添加到派生异常类中:
public class MonitoredException : Exception
{
public readonly ExceptionDanger danger;
public MonitoredException(string message, ExceptionDanger danger)
: base(message)
{
danger = danger;
}
}在AppDomain.FirstChanceException事件订阅服务器中,我们使用这些信息构建一个新的日志信息(与AppDomain.UnhandledException相同):
static void FirstChanceHandler(object source, FirstChanceExceptionEventArgs e)
{
var monitoredException = e.Exception as MonitoredException;
if(monitoredException != null)
{
var exDanger = monitoredException.danger;
var exType = monitoredException.GetType().Name;
var exTimestamp = DateTime.Now;
// Build a package like a struct or so and exDanger, exType and exTimestamp to it
}
}现在,当服务器接收到包(由exDanger和exType组成)时,数据可以用于存储引发此类错误的数量,如果将用户ID添加到包中,则可以指定哪些用户抛出异常。ExceptionDanger枚举用于排序异常服务器端的重要性。
我希望这能给你一些提示,或者至少给你一个关于如何分类和分析异常的想法。
https://softwareengineering.stackexchange.com/questions/287326
复制相似问题