ASP.NET错误的“事件日志”源属性的自定义值

时间:2009-01-31 21:45:29

标签: c# asp.net logging event-log

默认情况下,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的文档,但没有找到一个明显的地方来改变它。我想知道它是否可以改变。

3 个答案:

答案 0 :(得分:2)

您最好的选择是按预期使用source属性,但在安装程序中使用安装程序类在安装时设置注册表(在Admin下),例如:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;

namespace InstallerClasses
{
    [RunInstaller(true)]
    public partial class EventLog : Installer
    {
        private EventLogInstaller eventLogInstaller;

        /// 
        /// Creates the event log for MyApp
        /// 
        public EventLog()
        {
            InitializeComponent();

            // Create an instance of an EventLogInstaller.
            eventLogInstaller = new EventLogInstaller();

            // Set the source name of the event log.
            eventLogInstaller.Source = "MySource";

            // Set the event log that the source writes entries to.
            eventLogInstaller.Log = "Application";

            // Add myEventLogInstaller to the Installer collection.
            Installers.Add(eventLogInstaller);
        }
    }
}

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError().GetBaseException();
    // logging code here
}