ASP.NET Web应用程序使用健康监控进行日志记录不起作用

12

我正在使用VS2005 C# 2.0和SQL Server 2005。

我参考了这个配置Health Monitoring的指南。

在指南的末尾,会有一个按钮在Default.aspx页面上,当点击该按钮时,将会在我的SQL表中插入一条新记录。

但是,当我按下按钮后,并没有在表中插入任何记录。

我不确定出现了什么错误,因为没有显示任何错误消息,所以我猜想唯一的方法就是试错,找出哪里出了问题。

P.S. 我无法编译MyWebEvents类库,因为没有输出。在我的主Web应用程序中,我从MyWebEvents项目文件的bin文件夹中添加了引用dll。我引用的DLL是否可用,或者我漏掉了编译的步骤?

以下是我运行的代码,参考了微软网站:


MyCriticalEvent.cs位于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");
    }
} 
}

主Web应用程序中的Default.aspx.cs

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 应用程序中的 Web.config 文件:

<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>

图片描述


我的数据库中有一个表:

图片描述


如果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):


问题概述: 当点击Default.aspx.cs中的button1时,没有将日志记录插入aspnet_WebEvent_Event表。

请问我哪部分代码出了问题或者是遗漏了?


你确定连接 SQL 的凭据足够吗?也许可以尝试使用 SQL 账户而不是集成安全性,看看是否有任何变化。此外,在测试时可以运行 SQL Profiler 对服务器进行分析,以查看是否实际发送了任何内容到 SQL。 - Darth Continent
@DarthContinent,我已经使用管理员特权帐户更改了登录方式,但是根据建议使用SQL Profiler跟踪服务器时,当我按下按钮时,我没有看到任何新的事件。 - gymcode
我猜你一定运行了 aspnet_regsql.exe -E -S <ServerName> -A w。数据库中是否创建了任何表格? - Amar Palsapure
@AmarPalsapure 我使用了 aspnet_regsql.exe -S <IP> -U <username> -P <password> -d <DB> -A w 命令。表已经被创建。我也更新了我的帖子,并附上了截图。 - gymcode
应用程序池是否具有访问 SQL Server 的权限?您尝试过使用 VS 2013 - ASP.NET 4.6.1 进行健康监测吗? - Kiquenet
2个回答

3
如果您想立即查看,请尝试禁用缓冲。
<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服务器可能会因为大量事件触发而过载,最好保留缓冲。

或者

我发现可以通过以下方式强制保存日志:

1:在Visual Studio中启动项目 2:单击按钮 3:停止项目,然后再次启动项目 4:检查数据库,您应该可以看到已记录事件


感谢您的建议。我已尝试禁用缓冲区并更改我的minInterval,也尝试了您强制记录的方法,但它们对我没有起作用,没有记录插入到数据库中。 - gymcode
是的,当我将我的SQL连接字符串拆分为无效字符串时,我也收到了与您类似的错误。 - gymcode
不好意思,我的意思是使用你之前用过的字符串,并检查事件日志以查看是否出现错误(我只是故意破坏我的代码以查看错误详细信息)。我假设你原来的SQL连接字符串没有抛出错误,对吗? - Richard Hanley
打破字符串,你的意思是这个字符串吗?=>“执行关键操作”。是的,我的原始SQL连接字符串没有显示任何错误。 - gymcode
1
抱歉,我似乎让事情变得混乱了,请忽略我关于数据库连接字符串的所有评论。我只是试图弄清楚您是否在连接数据库时遇到了问题。如果您在事件日志中没有收到连接到数据库的错误,并且已经按照我建议的所有缓冲区设置进行了设置,那么我不确定还有什么其他问题。我使用了您的代码并设置了一个本地的aspnetdb,运行后我看到了插入的行。除了我关于调整缓冲区和最小间隔的建议之外,我没有做任何更改。我一定是漏掉了什么,但我不确定是什么,抱歉。 - Richard Hanley
显示剩余2条评论

2
尝试使用TraceWebEventProvider暂时替换SqlWebEventProvider,以查看问题是在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>
...

你能指定我需要用TraceWebEventProvider替换SqlWebEventProvider的哪个区域吗?我已经尝试使用你提供的链接替换我的web.config的一部分,但出现了多个错误,我面临的一个问题是“无法加载文件或程序集'System.Web'或其某个依赖项”。谢谢。 - gymcode
谢谢你提供的例子。但是我收到了这个错误 Parser Error Message: Could not load file or assembly 'System.Web' or one of its dependencies. The system cannot find the file specified. 并且在错误页面上突出显示了这一行:Line 24: type="System.Web.Management.TraceWebEventProvider, - gymcode
你是否尝试过使用完整签名的 System.Web - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接