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