如何用在asp.net中写入事件日志

来源:互联网 发布:医疗大数据 盈利模式 编辑:程序博客网 时间:2024/05/01 00:02

如何用asp.net写事件日志

来源:http://support.microsoft.com/default.aspx?scid=kb;en-us;329291

关键字:asp.net 事件日志 错误消息

 

重要事项

本文包含有关编辑注册表的信息。编辑注册表之前,务必先了解在发生问题时如何还原注册表。有关如何还原注册表的信息,请查看 Regedit.exe 中的“还原注册表”帮助主题,或 Regedt32.exe 中的“还原注册表项”帮助主题。

 

现象

当你使用asp.net 向事件日志中写入一个新的“事件来源”时,可能会得到如下错误消息:System.Security.SecurityException: 不允许所请求的注册表访问权

 

原因

运行asp.net进程的默认怅户是ASPNET(IIS6.0下面是NetworkService),而此用户并没有权限来创建“事件来源”。

 

解决办法

注意(编辑注册表会导致系统崩溃之类的微软吓你的话就不多说)。如果你需要解决此问题,在你运行此Asp.net程序之前,则必须要由具有管理员权限的用户来创建一个“事件来源”。下面有几个方法用来创建 “事件来源”。

 

第一个方法

 

使用下列步骤在注册表编辑中在应用程序日志下面创建一个“事件来源”

1.  点击“开始”,再点击“运行”。

2.  在“打开”框中输入“regedit”。

3.  找到下列子键:

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application

4.  右击“Application”点击“新建”再点“项”

5.  将此新建项重命名为“Test

6.  关闭注册表编辑器

 

第二个方法

 

System.Diagnostics命名空间中有一个EventLogInstaller类。它能够创建和配置你的应用程序在运时要读写的事件日志。通过下列步骤,我们能够使用EventLogInstaller类来创建一个“事件业源”

1.  VB.NETC#来创建一个名为EventLogSourceInstaller的“类库”。

2.  在项目中添加对System.Configuration.Install.dll,的引用。

3.  将自动产生的Class.Vb/Class.cs更命名为MyEventLogInstaller.vb/MyEventLogInstaller.cs

4.  MyEventLogInstaller.vb MyEventLogInstaller.cs中的内容替换为以下代码:


Visual Basic .NET Sample

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 Sample

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);

              }

       }

}

 

5.  生成此项目,得到EventLogSourceInstaller.dll

6.  打开Visual Studio .NET 命令提示,转到EventLogSourceInstaller.dll所在目录。

7.  运行此命令来创建“事件来源”:InstallUtil EventLogSourceInstaller.dll

 

更详尽的信息

 

我们通过一个创建一个Web Application来重现以上错误以及解决此问题。

1.  使用VB.NetC#建立一个Asp.net Web Application

2.  WebForm1.aspx中的代码替换为以下代码:

   Visual Basic .NET Sample

<%@ Page Language="vb" AutoEventWireup="true" %>

<%@ Import namespace="System.Diagnostics" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

       <script language="VB" runat="server">

       Sub WriteEvent_Click(Src As Object, e As EventArgs)

       Dim ev As New EventLog("Application")

       ' Event's Source name

       ev.Source = "TEST"

      

       EventLog.CreateEventSource(ev.Source, "Application")

      

Try

        ev.WriteEntry(TextBox1.Text)

       Catch b as exception

        Response.write ("WriteEntry " & b.message & "<br>")

       End Try

       ev = Nothing

       End Sub

       </script>

 

       <body>

              <form id="Form1" runat="server">

                     Event message:

                     <asp:textbox id="TextBox1" runat="server" Width="233px"></asp:textbox>

                     <asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>

              </form>

       </body>

</HTML>

 

Visual C# .NET Sample

<%@ Page Language="c#" AutoEventWireup="true" %>

<%@ Import namespace="System.Diagnostics" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

       <script language="C#" runat="server">

       void WriteEvent_Click(Object Src, EventArgs e)

       {

       EventLog ev = new EventLog("Application");

       // Event's Source name

       ev.Source = "TEST"; 

      

       EventLog.CreateEventSource(ev.Source, "Application");

 

                     try

                     {

                            ev.WriteEntry(TextBox1.Text);

                     }

                     catch (Exception b)

                     {

                            Response.Write("WriteEntry " + b.Message + "<br>");

                     }

                     ev = null;

       }

       </script>

 

       <body>

              <form id="Form1" runat="server">

                     Event message:

                     <asp:textbox id="TextBox1" runat="server" Width="233px"></asp:textbox>

                     <asp:button id="Button1" onclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>

              </form>

       </body>

</HTML>

3.  F5启动此项目。

4.  TextBox输入一些字符,然后点击Write to Event Log

5.  在上面“现象”部分中提到的错误消息会出现。

6.  要解决此问题,在Webform1.aspx将下面这行代码注释
EventLog.CreateEventSource(ev.Source, "Application");

7.  重新启动此项目。

 

参考

要取得更详尽的信息,请访问微软网站:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbwlkWalkthroughCreatingEventLogInstallers.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticseventlogclasstopic.asp

原创粉丝点击