4

默认情况下,ASP.NET 将所有未捕获的异常记录到系统事件日志中。我知道应该有一个适当的日志记录设施,但这总比没有好,它可以很好地作为一种临时解决方案。

我希望能够有效地过滤日志中的事件。我了解到,在以编程方式记录时,您可以通过以下方式为事件日志中的 Source 列设置自定义值:

EventLog eventLog = new EventLog("Application");
eventLog.Source = "My custom name";
eventLog.WriteEntry("Some error description ...", EventLogEntryType.Error);

但是,ASP.NET 将此值设置为“ASP.NET”,后跟其版本。我简要检查了 web.config 的文档,但没有找到明显的地方来更改它。我想知道它是否可以改变。

4

3 回答 3

2

最好的办法是按预期使用源属性,但在安装程序中使用安装程序类在安装时(在管理员下)设置注册表,例如:

使用系统;
使用 System.Collections;
使用 System.Collections.Generic;
使用 System.ComponentModel;
使用 System.Configuration.Install;
使用 System.Diagnostics;

命名空间安装程序类
{
    [运行安装程序(真)]
    公共部分类事件日志:安装程序
    {
        私人事件日志安装程序事件日志安装程序;

        ///
        /// 为 MyApp 创建事件日志
        ///
        公共事件日志()
        {
            初始化组件();

            // 创建一个 EventLogInstaller 的实例。
            eventLogInstaller = new EventLogInstaller();

            // 设置事件日志的源名称。
            eventLogInstaller.Source = "我的来源";

            // 设置源写入条目的事件日志。
            eventLogInstaller.Log = "应用程序";

            // 将 myEventLogInstaller 添加到 Installer 集合中。
            Installers.Add(eventLogInstaller);
        }
    }
}

并确保它在您的安装程序中作为自定义操作运行。

于 2009-02-02T00:46:12.920 回答
1

似乎使用源属性不是一个好主意。最初,我认为这是一个自由格式的文本。但是我刚刚发现它必须通过 RegisterEventSource(...) Win32 API 函数进行注册,并且这似乎仅在应用程序在管理员权限下运行时才有效。.NET 默默地为您创建一个新源,但如果您不是管理员,它会引发异常。所以总的来说,在 ASP.NET 中使用临时源名称可能需要一些预先注册,这将在部署中引入另一个步骤。

于 2009-02-01T16:38:20.503 回答
0

您可能希望在 global.asax 中处理未捕获的异常,然后以编程方式记录异常,如下所示:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError().GetBaseException();
    // logging code here
}
于 2009-01-31T21:56:18.007 回答