Ведение журнала ASP.NET Web App с использованием мониторинга работоспособности не работает - PullRequest
12 голосов
/ 01 февраля 2012

Я использую VS2005 C # 2.0 и SQL Server 2005.

Я имею в виду это руководство по настройке мониторинга работоспособности.

В конце руководства будет кнопка Default.aspx и нажатие кнопки on_Click, новая запись будет вставлена ​​в мою таблицу SQL.

Однако, когда моя кнопка нажата, в таблицу не вставляется запись.

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

P.S. Я не могу скомпилировать библиотеку классов MyWebEvents, потому что нет вывода. В моем основном веб-приложении я добавил справочную dll из папки bin моего файла проекта MyWebEvents . DLL, на которую я ссылаюсь, действительна для использования, или есть шаг, который я пропустил при компиляции?

Ниже приведены коды, которые я запустил со ссылкой на сайт Microsoft:


MyCriticalEvent.cs in MyWebEvents библиотека классов:

namespace MyWebEvents
{
public class MyCriticalEvent : WebAuditEvent
{
    private string userID;
    private string authType;
    private bool isAuthenticated;

    public MyCriticalEvent(string msg, object eventSource, int eventCode)
        : base(msg, eventSource, eventCode)
    {
        // Obtain the HTTP Context and store authentication details
        userID = HttpContext.Current.User.Identity.Name;
        authType = HttpContext.Current.User.Identity.AuthenticationType;
        isAuthenticated = HttpContext.Current.User.Identity.IsAuthenticated;
    }

    public MyCriticalEvent(string msg, object eventSource, int eventCode,
                           int eventDetailCode)
        : base(msg, eventSource, eventCode, eventDetailCode)
    {
        userID = HttpContext.Current.User.Identity.Name;
        authType = HttpContext.Current.User.Identity.AuthenticationType;
        isAuthenticated = HttpContext.Current.User.Identity.IsAuthenticated;
    }

    public override void FormatCustomEventDetails(WebEventFormatter formatter)
    {
        base.FormatCustomEventDetails(formatter);
        formatter.AppendLine("User ID: " + userID);
        formatter.AppendLine("Authentication Type: " + authType);
        formatter.AppendLine("User Authenticated: " +
                              isAuthenticated.ToString());
        formatter.AppendLine("Activity Description: Critical Operation");
    }
} 
}

Default.aspx.cs in Главное веб-приложение :

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
    MyCriticalEvent testEvent = new MyCriticalEvent(
                                    "Critical Operation Performed",
                                    this,
                                    WebEventCodes.WebExtendedBase + 1);
    testEvent.Raise();
}
}

Web.config in Основное веб-приложение :

<configuration>
    <appSettings/>
    <connectionStrings>
        <add name="MySqlConnection" connectionString="Data Source=<IP>;Initial Catalog=<DB NAME>;Persist Security Info=True;User ID=<admin username>;Password=<admin password>" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <system.web>
                <healthMonitoring enabled="true" heartbeatInterval="0">
        <bufferModes>
            <clear/>
            <add name="Logging" maxBufferSize="1000" maxFlushSize="200" urgentFlushThreshold="800" regularFlushInterval="00:05:00" urgentFlushInterval="00:01:00" maxBufferThreads="1"/>
        </bufferModes>
        <providers>
            <clear/>
            <add name="MySqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="MySqlConnection" maxEventDetailsLength="1073741823" buffer="true" bufferMode="Logging"/>
        </providers>
        <eventMappings>
            <clear/>
            <add name="All Audits" type="System.Web.Management.WebAuditEvent" startEventCode="0" endEventCode="2147483647"/>
            <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent" startEventCode="0" endEventCode="2147483647"/>
        </eventMappings>
        <profiles>
            <clear/>
            <add name="Audit Logs" minInstances="1" maxLimit="Infinite" minInterval="00:00:15"/>
            <add name="Error Logs" minInstances="1" maxLimit="Infinite" minInterval="00:00:15"/>
        </profiles>
        <rules>
            <clear/>
            <add name="All Audits Default" eventName="All Audits" provider="MySqlWebEventProvider" profile="Audit Logs"/>
            <add name="All Errors Default" eventName="All Errors" provider="MySqlWebEventProvider" profile="Error Logs"/>
        </rules>
    </healthMonitoring>
    </system.web>
</configuration>

enter image description here


Таблица в моей базе данных:

enter image description here


Ошибка в журнале событий при разрыве соединения SQL:

The following exception was thrown by the web event provider 'MySqlWebEventProvider' in the application '/TestLogSite' (in an application lifetime a maximum of one exception will be logged per provider instance):


Сводка проблемы : При нажатии button1 на Default.aspx.cs записи журнала не добавляются в таблицу aspnet_WebEvent_Event.

Могу ли я узнать, в какой части моего кода я ошибся или пропустил?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Если вы хотите увидеть это сразу, попробуйте отключить буферизацию

<add name="MySqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="MySqlConnection" maxEventDetailsLength="1073741823" buffer="true" bufferMode="Logging"/>

изменить на

<add name="MySqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="MySqlConnection" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Logging"/>

Это должно остановить задержку, вызванную буферизацией, и вы должны увидеть, что строки появляются сразу.

Кроме того, вы можете уменьшить значение minInterval в профилях до значения "00:00:01":)

Подробнее о буферизации вы можете прочитать здесь:

http://msdn.microsoft.com/en-us/library/ms178708%28v=vs.80%29.aspx

В реальной системе может быть хорошей идеей оставить буферизацию на месте, если вы считаете, что ваш SQL-сервер может быть перегружен большим количеством событий.

OR

Я обнаружил, что могу сохранить его в журнале:

1: начните свой проект в визуальной студии 2: нажмите кнопку 3: Остановите проект и запустите его снова 4: проверьте в базе данных, вы должны увидеть событие, зарегистрированное

2 голосов
/ 09 февраля 2012

Попробуйте временно заменить SqlWebEventProvider на TraceWebEventProvider , чтобы проверить, не связана ли проблема с ASP.NET WebEvents или с доступом к базе данных SQL.

TraceWebEventProvider должен избегать проблем, связанных с разрешениями.

Обновлено

web.config:

<system.web>
    ...
    <providers>
        <clear/>
            <add name="TraceEventProvider"
        type="System.Web.Management.TraceWebEventProvider, 
          System.Web"
        buffer="false"
        bufferMode=""
        maxEventLength="4096"
        maxSize="4096"
        maxMessagesPerNotification="1"
    />
    </providers>
    ...
    <rules>
        <clear/>
        <add name="All Audits Default" eventName="All Audits" provider="TraceEventProvider" profile="Audit Logs"/>
        <add name="All Errors Default" eventName="All Errors" provider="TraceEventProvider" profile="Error Logs"/>
    </rules>
    ...
</system.web>
...
...