我应该如何写入 EventLog

How should I write to EventLog

可能我只是误解了System.Diagnostics.EventLog,但我无法以我的应用程序名称写入事件日志。项目是 ASP.NET 网络服务 (.NET Framework 4),在 NETWORK SERVICE 用户下工作。

我试过了并且有效(如here所述):

using (System.Diagnostics.EventLog eventLog = new System.Diagnostics.EventLog())
{
    eventLog.Source = "Application";
    eventLog.WriteEntry("MY LOG INFO", System.Diagnostics.EventLogEntryType.Information);
}

Application 不是我的应用程序的名称。所以我试着把eventLog.Source = "Application";改成了eventLog.Source = System.Diagnostics.Process.GetCurrentProcess().ProcessName;。结果异常 未找到源,但有些...here。 ProcessName是w3wp,对我来说没问题,但是我不能写日志。所以我尝试用 logName 参数重载构造函数,但没有成功。

如果我理解的很好,WriteLog方法在某些情况下需要访问注册表(回答here)?好的,这需要更多的 dll 更新。很好的建议是在安装过程中写下提到的注册表更改。但是,我的更改是“仅”更新分布式 dll,而不是新安装。

MSDB 是卑鄙的,我找到了一些关于 EventLogPermissionAttribute(here) and EventLogPermission(here) 的东西,但它对我一点帮助都没有。我尝试使用它,但总是遇到相同的异常。没有例子。

我最后找到这个 (source):

EventLogPermission eventLogPermission = new EventLogPermission(EventLogPermissionAccess.Administer, ".");
eventLogPermission.PermitOnly();
if (!EventLog.SourceExists(source))
{
    EventLog.CreateEventSource(source, "Application");
}
EventLog.WriteEntry(source, message, entryType);

但它以类似的异常结束。现在它说的很少:它无法访问“安全”协议。

所以,问题是:我应该如何写入 EventLog?或者确实需要更新注册表(我可以通过我们的更新工具来完成,但我不相信我想这样做)。

我还想了解 System.Diagnostics.EventLog 的工作原理以及它在后台执行的操作,以便更好地理解我的代码(如果它对我有用的话)。

您需要管理员权限才能创建自定义事件日志源,而 NETWORK SERVICE 没有该权限。您将需要更新安装程序以创建该日志源,然后安装程序必须 运行 作为管理员。