始终可用于写入的事件日志源?
Posted
技术标签:
【中文标题】始终可用于写入的事件日志源?【英文标题】:An event log source that's always available for writing? 【发布时间】:2010-12-27 09:58:28 【问题描述】:是否有始终可供 ASP.NET Web 应用编写的事件日志源?
背景故事,以防有人有看似无关的解决方案:
我们的 ASP.NET webapp 使用它自己的事件日志源,但它没有创建它的权限。因此,如果在 webapp 尝试写入条目时事件日志源不存在(安装说明指示管理员手动注册事件日志源,但是......),我们的 webapp 不会放入任何内容出现问题时的事件日志。
我希望有另一个(与应用无关的)来源可以用来通知观看事件日志的人。
【问题讨论】:
【参考方案1】:在这篇知识库文章中,它解释了这个问题 http://support.microsoft.com/kb/329291
PRB:当 ASP.NET 应用程序尝试在 EventLog 中写入新的 EventSource 时出现“不允许请求的注册表访问”错误消息
症状
当您使用 ASP.NET 在事件日志中创建新的事件源时,您可能会收到以下错误消息:
System.Security.SecurityException:不允许请求的注册表访问。
原因
默认情况下,ASP.NET 工作进程的用户令牌是 ASPNET(或 NetworkService,用于在 Internet Information Services [IIS] 6.0 上运行的应用程序)。出现“症状”部分的问题是因为您的帐户没有正确的用户权限来创建事件源。
分辨率
第一种方法:
在注册表编辑器的应用程序事件日志下创建一个事件源(在服务器上,而不是您的开发 PC)。为此,请按以下步骤操作:
访问服务器的 Windows 桌面。单击开始,然后单击运行。 在“打开”文本框中,键入 regedit。 找到以下注册表子项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
右键单击 Application 子项,指向 New,然后单击 Key。 键入“TEST
”作为密钥名称。 关闭注册表编辑器。第二种(替代)方法:
System.Diagnostics
命名空间中的EventLogInstaller
类允许您安装和配置应用程序在运行时读取或写入的事件日志。您可以使用EventLogInstaller
创建事件源。为此,请按以下步骤操作:使用 Microsoft Visual Basic .NET 或 Microsoft Visual C# .NET 创建一个名为 EventLogSourceInstaller 的新类库。默认情况下会创建 Class1.vb 文件或 Class1.cs 文件。 在解决方案资源管理器中,右键单击
EventLogSourceInstaller
,然后单击添加引用。 在“添加引用”对话框中,双击System.Configuration.Install.dll
,然后单击“确定”。 将Class1.vb
`Class1.cs` 重命名为 MyEventLogInstaller.vb\MyEventLogInstaller.cs。 将MyEventLogInstaller.vb
或MyEventLogInstaller.cs
中的现有代码替换为以下示例代码: Visual Basic .NET 示例Imports System.Diagnostics Imports System.Configuration.Install Imports System.ComponentModel <RunInstaller(True)> _ Public Class MyEventLogInstaller Inherits Installer Private myEventLogInstaller As EventLogInstaller Public Sub New() ' Create an instance of 'EventLogInstaller'. myEventLogInstaller = New EventLogInstaller() ' Set the 'Source' of the event log, to be created. myEventLogInstaller.Source = "TEST" ' Set the 'Log' that the source is created in. myEventLogInstaller.Log = "Application" ' Add myEventLogInstaller to 'InstallerCollection'. Installers.Add(myEventLogInstaller) End Sub End Class
Visual C# .NET 示例
using System; using System.Diagnostics; using System.ComponentModel; using System.Configuration.Install; namespace EventLogSourceInstaller [RunInstaller(true)] public class MyEventLogInstaller : Installer private EventLogInstaller myEventLogInstaller; public MyEventLogInstaller() //Create Instance of EventLogInstaller myEventLogInstaller = new EventLogInstaller(); // Set the Source of Event Log, to be created. myEventLogInstaller.Source = "TEST"; // Set the Log that source is created in myEventLogInstaller.Log = "Application"; // Add myEventLogInstaller to the Installers Collection. Installers.Add(myEventLogInstaller);
在“构建”菜单上,单击“构建解决方案”以创建 EventLogSourceInstaller.dll。 打开 Visual Studio .NET 命令提示符。 在命令提示符下,切换到 EventLogSourceInstaller.dll 所在的文件夹。 运行以下命令创建事件源:
InstallUtil EventLogSourceInstaller.dll
如果您使用解决方案下的第二种方法,您应该可以使用它。
如果您不想这样做或无法使其正常工作,另一种方法是使用web.config
中的身份标签并模拟一个有权编辑注册表的用户。这只是针对此应用程序的安全整体,但如果您实施一些额外的安全措施,您应该没问题。
【讨论】:
【参考方案2】:考虑电子邮件通知?我猜有些管理员更喜欢通过手机收到通知。
如果客户端拒绝在 HKLM\System\CurrentControlSet\Services\EventLog\ 下创建密钥,您也可以打电话回家(调用 Web 服务将日志写回您自己的服务器)
【讨论】:
【参考方案3】:您可能无权从 Web 应用程序创建事件源,但如果内存够用,您可以检查是否存在。
在 global.asax 或自定义处理程序中,检查他们是否按照应有的方式创建它。如果他们没有,在每个页面上都显示一个非常烦人的提醒 div。一旦他们按照他们应该的方式创建它,div 就会消失 :)
【讨论】:
对我最初的问题没有一个可靠的答案,这很可能是我要做的。谢谢。【参考方案4】:The "ASP.NET X.Y.Z.0" source will, I think,随时待命。
【讨论】:
【参考方案5】:您应该能够轻松写入内置事件日志(应用程序、安全性、系统)。
【讨论】:
我将使用什么作为我的事件源? 使用任何你想要的事件源。如果源未注册,消息将被放入系统内置的“应用程序”日志中,但源仍会出现在实际消息中。 嗯。对于您通过“在实际消息中”的来源观察到的消息,事件日志在“来源”列中显示什么值? 不正确:您需要一个与“应用程序”、“安全”或“系统”相一致的来源,并且在不完全信任的情况下,并不总是清楚哪些来源可用。与另一条评论相矛盾的是,.Net 并不总是只使用内置的应用程序日志。 这个答案没有回答问题; OP 专门要求提供内置事件日志源,而不是内置事件日志。除了事件日志之外,写入事件日志还需要一个源。以上是关于始终可用于写入的事件日志源?的主要内容,如果未能解决你的问题,请参考以下文章
无法打开源“Microsoft.Practices.EnterpriseLibrary.Data”的日志。读取/写入事件日志时,您可能没有写入权限