我试图在2分钟的滑动窗口持续时间内发生超过2个错误时触发电子邮件功能。但是,在测试期间,错误监视器不起作用。例如,在以下函数中
private void Deserialize(string info)
{
try {
SampleData data = JsonConvert.DeserializeObject<SampleData>(info);
}
catch ( Exception e ) {
TraceEvent error = new TraceEvent(TraceLevel.Error, "Error detected");
error.Properties.Add("ErrorInfo", e.Message);
trace.Trace(error);
}
如果字符串 info 无法反序列化,则抛出异常,并且2个此类错误应触发此函数:
private void ErrorMonitor([ErrorTrigger("00:02:00", 2, Throttle = "1:00:00")] TraceFilter filter)
{
EmailInfo();
}
然而,这不起作用。我是否正确地将ErrorMonitor绑定到TraceFilter?这只是一个示例代码,我有多个函数可以发生错误,并且ErrorMonitor()需要跟踪所有这些。
更新:我发现ErrorTrigger工作正常。 ErrorTrigger无法工作的原因是因为所有异常都在try-catch块中处理。 ErrorTrigger从Trace中获取错误。并且ErrorTriggers不会将控制台上任何非错误消息(以红色显示)视为错误;无论发生多少例外。
更新2:布鲁斯的建议使得即使在处理try-catch块中的错误后也能从Trace中获取错误消息。必须在期望错误的函数中传递TraceWriter。修改后的代码是:
private void Deserialize(string info, TraceWriter trace) { }
答案 0 :(得分:2)
根据您的要求,我测试了它,我可以按照预期在我这边工作。请注意,您不需要使用try-catch
包装代码。发生错误时,运行时会自动收集错误。这是我的代码片段,您可以参考它:
<强> Program.cs的强>
static void Main()
{
JobHostConfiguration config = new JobHostConfiguration();
config.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Verbose;
config.UseTimers();
config.UseCore();
JobHost host = new JobHost(config);
host.RunAndBlock();
}
<强> Functions.cs 强>
public static void TimerWorker([TimerTrigger("00:00:10")] TimerInfo timer)
{
//Simulate throwing errors when running your logic code
throw new Exception(string.Format("GenerateError:{0}", DateTime.Now.Ticks));
}
/// <summary>
/// Global error monitor function that will be triggered whenever errors
/// </summary>
/// <param name="filter"></param>
public static void ErrorMonitor([ErrorTrigger("00:00:20", 1, Throttle = "00:00:40")] TraceFilter filter)
{
//log last 5 detailed errors to the Dashboard
string errors = filter.GetDetailedMessage(5);
Console.WriteLine("ErrorMonitor: " + errors);
}
注意:在代码中,只要在20秒的滑动窗口内发生1次错误就会触发ErrorMonitor
(每40秒最多会发出1次通知)。
此外,您还可以指定仅处理特定函数错误的特定错误处理程序。您可以按照tutorial关于ErrorTrigger的说明来更好地理解它。