当Azure应用程序服务(网站)引发异常时通过电子邮件通知我的管理员的最佳方式

oug3syen  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(151)

我目前正在使用Sendgrid向我所有的用户发送关于他们在我的网站上执行的特定事件的格式化电子邮件(例如,创建一个登录,添加信用卡等),我正在使用Sendgrid创建一个电子邮件服务(通过我的Azure门户订阅)。我也在使用.Net日志记录器服务,并认为我可以通过该服务获得电子邮件通知,但我的Azure门户里什么都没看到

问题-如果我的网站像下面的例子一样抛出异常,最好的通知方式是什么?

1.使用我的电子邮件服务向自己发送电子邮件?或
1.使用某些Azure设置发送电子邮件?
这里有一个服务器端的例子,我目前正在做的是用Sendgrid给自己发一封电子邮件,但它似乎不是最好的解决方案。

try {
     // perform some action and save to db
 } catch(Exception ex) {
     _logger.LogError(ex, "Error: " + ex.ToString());
     _emailService.SendEmailError("Some Exception", ex.ToString());
 }

更新-基于Peter Bons下面的帖子-我已经启动并运行了应用程序洞察,我可以看到一些数据。然后我创建了一个行动组(“notify”)并将其配置为向我发送电子邮件。我从Azure收到一些通知,说它已配置,所以一切正常。接下来,我尝试在应用程序应用程序警报面板中创建警报,但是对于我需要选择哪种类型的信号进行日志记录感到困惑。我尝试创建2个不同的警报,指标下的“异常”上有1个,活动日志下的“所有管理操作”上有1个。一旦这2个警报起作用,我就开始收到电子邮件。但是我开始收到很多电子邮件,Azure由于费率限制而关闭了我,所以现在我有一些问题:

1.我在哪里创建警报?我看到可以在2个不同的地方创建警报1.)应用服务警报2.)应用服务应用程序洞察警报。在应用程序洞察警报部分似乎没有触发事件,只有在应用程序警报部分。
1.当我记录信息时,我选择什么类型的信号(例如_logger.LogError())将被触发,因为即使当我使用verbose创建基于任何管理事件的警报时(因此大量的警报触发器和创建的电子邮件)没有事件触发和电子邮件记录器调用!

abithluo

abithluo1#

使用this tutorial作为起点将Azure Application Insights添加到组合中,并使用alerts功能。
正确完成后,像这样的代码_logger.LogError(ex, "Error: " + ex.ToString());将在Application Insights中生成异常遥测项,如下所示:
ApplicationInsightsLoggerProvider捕获ILogger日志并从中创建TraceTelemetry。如果将Exception对象传递给ILogger上的Log方法,则会创建ExceptionTelemetry而不是TraceTelemetry。
在此之后,您可以根据条件创建alert rule,就像发生了异常一样。警报规则附加了一个或多个action groups。这些操作组定义了触发警报规则后采取的操作。例如,发送电子邮件。
使用警报规则和操作规则的好处是,触发警报的方式以及触发警报时发生的操作是,使警报规则被触发的代码(例如_logger.LogError(ex, "Error: " + ex.ToString()))与接下来发生的任何事情解耦。如果您需要更改电子邮件地址,我想包括不同的行动,如发送短信或触发一个网页挂钩,你可以这样做,而无需修改任何代码。
完整的教程可以在here中找到
关于你的另外两个问题:
我在哪里创建警报?我看到可以在2个不同的地方创建警报1.)应用服务警报2.)应用服务应用程序洞察警报。在应用程序洞察警报部分似乎没有触发事件,只有在应用程序警报部分。
您可以在许多地方开始定义警报。您甚至可以从Azure Monitor资源创建一个警报。如果您这样做,则需要深入到作为警报规则源的资源。
选择应用程序服务应用程序洞察警报时,您已经深入到正确的资源,因此这是最佳的起点。
当我记录信息时,我选择什么类型的信号(例如_logger.LogError())将被触发,因为即使当我使用verbose创建基于任何管理事件的警报时(因此大量的警报触发器和创建的电子邮件)没有事件触发和电子邮件记录器调用!
首先,不要使用Activity Log部分的任何信号。这些信号表示资源本身发生了变化,例如更新了Application Insights设置或扩展了Web App。
要为_logger.LogXXX()生成的日志创建警报规则,请使用Custom log search信号,请参阅您的其他问题。

rggaifut

rggaifut2#

您可以使用Azure Application Insights捕获ASP.NET应用程序中的异常沿着请求遥测。
感谢Regan Downer,对于Send notification.您可以在应用程序中插入代码来调用Microsoft.ApplicationInsights.TrackTrace()。在message参数中发送POST数据。
您可以通过在异常处理程序中插入代码来报告异常,从而显式地记录异常。

创建使用SendGrid发送电子邮件的Azure函数。
在ASP.NET Core应用中,将以下代码添加到Startup.cs文件中以配置Application Insights。

public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetry();
    }

在ASP.NET核心应用中,将以下代码添加到Startup.cs中的Configure方法,以启用Application Insights异常跟踪:

app.UseExceptionHandler(errorApp =>
    {
        errorApp.Run(async context =>
        {
            var exception = context.Features.Get<IExceptionHandlerFeature>().Error;
            var telemetry = new TelemetryClient();
            telemetry.TrackException(exception);
            await context.Response.WriteAsync("An error occurred and has been logged.");
        });
    });

此代码将捕获应用中任何未处理的异常,并将其记录到Application Insights。
然后,您可以使用创建的Azure函数在Application Insights中记录异常时发送电子邮件通知。
从Azure Application Insights捕获异常。
一个二个一个一个
有关详细信息,请参阅MSDoc
send notification email与应用程序洞察日志。

using var channel = new ServerTelemetryChannel();
            try
            {
                IServiceCollection services = new ServiceCollection();
                services.Configure<TelemetryConfiguration>(
                    config =>
                    {
                        config.TelemetryChannel = channel;
                        // Optional: implement your own TelemetryInitializer instance and configure it here
                        // config.TelemetryInitializers.Add(new MyTelemetryInitializer());
                        config.DefaultTelemetrySink.TelemetryProcessorChainBuilder.UseSampling(5);
                        channel.Initialize(config);
                    });
                services.AddLogging(builder =>
                {
                    // Only Application Insights is registered as a logger provider
                    builder.AddApplicationInsights(
                        configureTelemetryConfiguration: (config) => config.ConnectionString = "<YourConnectionString>",
                        configureApplicationInsightsLoggerOptions: (options) => { }
                    );
                });
                IServiceProvider serviceProvider = services.BuildServiceProvider();
                ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();
                logger.LogInformation("Logger is working...");
            }
            finally
            {
                // Explicitly call Flush() followed by Delay, as required in console apps.
                // This ensures that even if the application terminates, telemetry is sent to the back end.
                channel.Flush();
                await Task.Delay(TimeSpan.FromMilliseconds(1000));
            }

相关问题