始终可用于写入的事件日志源?

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.vbMyEventLogInstaller.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 专门要求提供内置事件日志源,而不是内置事件日志。除了事件日志之外,写入事件日志还需要一个源。

以上是关于始终可用于写入的事件日志源?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用不存在的源写入 Windows 事件日志记录

无法打开源“Microsoft.Practices.EnterpriseLibrary.Data”的日志。读取/写入事件日志时,您可能没有写入权限

什么是日志文件?为什么要设立日志文件?

Eventlog控件的使用

在 Windows 7 事件日志中,啥是“源”?

ASP.Net Core 1 日志记录错误 - 找不到来自源应用程序的事件 ID xxxx 的描述