Как отследить серверное приложение .Net на наличие фатальных исключений? - PullRequest
5 голосов
/ 30 января 2010

Я занимаюсь разработкой серверного приложения .Net, которое должно работать непрерывно. Я хотел бы получать уведомления по электронной почте каждый раз, когда процесс сервера прекращается по любой причине. В идеале электронное письмо должно содержать сообщение об исключении и трассировку стека, если исключение вызвало прекращение. Я знаю, что некоторые исключения не могут быть пойманы, такие как StackOverflowException. Итак, как бы вы регистрировали / отправляли уведомление о том, что StackOverflowException произошло в процессе сервера?

Я думаю о том, как создать второй процесс для мониторинга процесса на сервере. Но как получить подробности об исключениях?

Ответы [ 4 ]

4 голосов
/ 30 января 2010

Неустранимые исключения, такие как StackOverflowException, обычно приводят к записи в журнале событий Windows (возможно, даже включая трассировку стека). Вы можете следить за своим журналом событий (например, с другой службой), который будет отправлять электронные письма по определенным записям. Простое приложение для мониторинга записей журнала событий описано здесь:

Инструмент мониторинга журнала событий в реальном времени

и здесь:

Отправка оповещений по электронной почте при записи ошибок в журнал событий

Если вы хотите, чтобы ваша служба постоянно работала и работала, вы можете настроить ее автоматический перезапуск в случае сбоя (хотя вы должны знать, что обычно это причина сбоя, и простой перезапуск не обязательно устраняет эту причину). ). Это можно сделать на вкладке Восстановление в свойствах службы. Там также есть возможность вызвать пользовательскую программу или сценарий в случае сбоя службы.

Еще один вариант использования встроенных функций Windows - настроить журнал событий для отправки уведомлений по электронной почте. Это работает по крайней мере с Windows Vista, как описано здесь:

Как настроить программу просмотра событий для отправки уведомления по электронной почте в Vista

1 голос
/ 30 января 2010

На самом деле, вам вообще не нужно никакого стороннего программного обеспечения для этого - планировщик задач Win7 может запускать запланированное задание всякий раз, когда он видит событие определенного типа, и необработанное исключение записывается в журнал событий. Одним из встроенных действий является «Отправить электронное письмо», так что у вас есть все ваше решение в ОС

0 голосов
/ 30 января 2010

Я бы порекомендовал внедрить монитор работоспособности. Хорошо иметь журнал для исключений, которые вы могли бы предвидеть и контролировать, но вы можете настроить свое приложение для обнаружения посторонних с помощью встроенной среды мониторинга работоспособности.

http://msdn.microsoft.com/en-us/library/ms998306.aspx

http://www.4guysfromrolla.com/articles/031407-1.aspx

0 голосов
/ 30 января 2010

У меня есть приложение (показанный код), которое перехватывает необработанные исключения и отображает диалоговое окно с пользовательскими исключениями, это может чем-то помочь?

Imports BM.BEAST.Presenters
Imports BM.BEAST.Security
Imports BM.BEAST.Business
Imports System.Threading

Public Class StartUp

    Shared Sub UnhandledException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)

        Dim unhandledException As New UnhandledExceptionView

        unhandledException.uxExceptionDetails.Text = e.Exception.ToString
        unhandledException.ShowDialog()

        If unhandledException.uxRestart.Checked Then
            Application.Restart()
        Else
            Application.Exit()
        End If

    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Entry point
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Shared Sub Main()

        'All unhandled exceptions are handled by the sub UnhandledException()
        'which displays a BEAST exception dialog and gives the user the chance
        'to copy the error to clipboard for pasting into email etc..
        AddHandler Application.ThreadException, AddressOf UnhandledException

        'Application framework not enabled
        My.User.InitializeWithWindowsUser()

        'Users must be authenticated
        If My.User.IsAuthenticated Then

            Dim securityPrincipal As Security.ISecurityPrincipal = Nothing
            Dim applicationController As ApplicationController = Nothing

            Try
                'Custom security principal for use throughout the session
                securityPrincipal = ServiceGateway.Instance.StartUserSession

                AppDomain.CurrentDomain.SetThreadPrincipal(securityPrincipal)
                Thread.CurrentPrincipal = securityPrincipal

                applicationController = applicationController.GetInstance
                applicationController.RegisterNavigator(New ApplicationNavigator)

                'If a user holds more than 1 role they will have to select
                'the role they want applied for use throughout the session
                If securityPrincipal.Roles.Count > 1 Then applicationController.NavigateTo("SelectRoleView")
                applicationController.NavigateTo("ShellView")

            Catch ex As Exceptions.InvalidUserNameException
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Invalid User")
            Catch ex As Exceptions.UserDisabledException
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "User Disabled")
            Catch ex As System.Net.Sockets.SocketException
                MsgBox("The xxxxx Server is unavailable, contact the System Administrator.", MsgBoxStyle.Exclamation, "Server Unavailable")
            End Try

        Else
            MsgBox("User not authenticated, the application will terminate.", MsgBoxStyle.Exclamation, "Authentication")
        End If

        My.Settings.Save()
        Application.Exit()

    End Sub

End Class
...