EventLog 구성 요소를 사용하면 로컬 컴퓨터와 원격 컴퓨터 모두에서 쉽게 Windows 이벤트 로그에 연결하고 이 로그에 엔트리를 쓸 수 있습니다. 또한 기존 로그에서 엔트리를 읽고 사용자 지정 이벤트 로그를 만들 수도 있습니다. 이벤트는 Windows에 정의되어 있는 것처럼 사용자에게 알려야 하는 운영 체제나 응용 프로그램에서 발생하는 모든 중요한 사건을 의미합니다. 중대한 이벤트는 화면에 즉시 메시지를 표시하는 방식으로 사용자에게 전달됩니다. 기타 이벤트는 나중에 참조할 수 있도록 여러 이벤트 로그 중의 하나에 기록됩니다. 모든 이벤트 로그 엔트리는 오류, 경고, 정보, 성공 감사 또는 실패 감사로 분류됩니다.
다음 세 가지 이벤트 로그는 Windows 2000 또는 Windows NT 4.0을 실행하는 컴퓨터에서 기본적으로 사용할 수 있습니다.
• 시스템 로그: 시스템 구성 요소에서 발생하는 이벤트를 추적합니다(예: 드라이버 문제).
• 보안 로그: 보안 변경 내용 및 침해 가능성을 추적합니다.
• 응용 프로그램 로그: 등록된 응용 프로그램에서 발생하는 이벤트를 추적합니다.
System.Diagnostics 네임스페이스의 언어 기능을 사용하여 사용자 지정 로그를 만들 수도 있습니다.
EventLog 구성 요소 인스턴스 구성과 관련된 세 가지 주요 속성이 있습니다.
• Log 속성은 상호 작용할 로그를 나타냅니다.
• MachineName 속성은 사용 중인 로그가 있는 컴퓨터를 나타냅니다.
• Source 속성은 구성 요소가 로그에 엔트리를 쓸 때 구성 요소 식별에 사용할 소스 문자열을 나타냅니다.
EventLog 구성 요소를 구성하는 방법은 해당 구성 요소를 사용하는 방법에 따라 다릅니다.
• 로그에 엔트리를 쓸 경우 다음 두 가지 방법 중 하나를 수행합니다. EventLog.CreateEventSource 메서드를 사용하여 소스를 등록하고 EventLog 구성 요소의 Source 속성을 동일한 소스로 설정하거나 해당 구성 요소에 대한 MachineName, Log 및 Source 속성을 설정합니다.
• 로그 엔트리를 읽거나 로그를 모니터링하려면 감시할 로그를 가리키도록 MachineName 및 Log 속성을 설정합니다. 이 경우에는 Source 속성을 설정할 필요가 없습니다.
다음 예제는 응용 프로그램 로그에 엔트리를 쓸 수 있도록 구성 요소를 구성하는 방법을 보여 줍니다. 이 경우에는 소스가 아직 로그에 등록되어 있지 않으므로 소스 문자열, 로그, 컴퓨터 이름 등을 지정해야 합니다. 소스가 아직 등록되어 있지 않은 경우 EventLog.WriteEntry를 호출하면 소스를 로그에 등록하기 때문에 CreateEventSource 메서드를 명시적으로 호출할 필요가 없습니다.
System.Diagnostics.EventLog EventLog1 = new
System.Diagnostics.EventLog("Application", "myserver", "newsource");
EventLog1.WriteEntry("Test");
소스가 이미 등록되어 있으면 단순히 Source 속성을 설정하고 엔트리를 쓰기만 하면 됩니다. 예를 들어, 다음 코드는 이미 등록되어 있는 소스를 사용하여 로그에 엔트리를 쓰는 방법을 보여 줍니다.
// C#
if (!System.Diagnostics.EventLog.SourceExists("ExistingSourceString"))
System.Diagnostics.EventLog.CreateEventSource(“ExistingSourceString","Application");
System.Diagnostics.EventLog EventLog1 =
new System.Diagnostics.EventLog();
EventLog1.Source = "ExistingSourceString";
EventLog1.WriteEntry("TestEntry2");
--------------------------
[이벤트 로그 기록 예제 1 ]
--------------------------
<%@ 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" [안내]태그제한으로등록되지않습니다-xxonclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>
</form>
</body>
</HTML>
[실행 결과]
[이벤트 로그 확인 결과]
--------------------------
[이벤트 로그 기록 예제 2 ]
--------------------------
<%@ Import Namespace="System.Diagnostics" %>
<%@ Page Language="C#" Debug="true" %>
<script Language="c#" runat="server" >
void EntrytoLog()
{
int[] array = new int[9];
for(int intCounter=0; intCounter <= 9;intCounter++)
{
array[intCounter] = intCounter;
Response.Write("카운터의 값:" + intCounter + "<br>");
}
}
void Page_Error(object sender, EventArgs e)
{
string errorMessage = "오류 발생:" + Server.GetLastError();
Server.ClearError();
string LogName = "MyApplicationLog";
string SourceName = "TEST";
if (!(EventLog.SourceExists(SourceName)))
{
EventLog.CreateEventSource(SourceName, LogName);
}
// 이벤트 로그에 추가
EventLog MyLog = new EventLog();
MyLog.Source = SourceName;
MyLog.WriteEntry(errorMessage, EventLogEntryType.Error);
}
</script>
<%
EntrytoLog();
%>
[실행 결과]
[이벤트 로그 확인 결과]
--------------------------
이벤트 로그 내용 일기
--------------------------
[디자인 파일]
[HTML 소스]
<%@ Page language="c#" Codebehind="EventLogRead.aspx.cs" AutoEventWireup="false" Inherits="EventLogRead.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="굴림">
<asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 227px; POSITION: absolute; TOP: 21px" runat="server"
Width="336px" Height="39px" Font-Size="X-Large">이벤트로그에서 읽기</asp:Label>
<asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 608px; POSITION: absolute; TOP: 20px" runat="server"
Width="99px" Height="34px" Text="Read Event"></asp:Button>
<asp:ListBox id="ListBox1" style="Z-INDEX: 103; LEFT: 59px; POSITION: absolute; TOP: 91px" runat="server"
Width="703px" Height="401px"></asp:ListBox></FONT>
</form>
</body>
</HTML>
using System;
using System.Diagnostics;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace EventLogRead
{
/// <summary>
/// WebForm1에 대한 요약 설명입니다.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.ListBox ListBox1;
private void Page_Load(object sender, System.EventArgs e)
{
// 여기에 사용자 코드를 배치하여 페이지를 초기화합니다.
}
#region Web Form 디자이너에서 생성한 코드
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 이 호출은 ASP.NET Web Form 디자이너에 필요합니다.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Button1_Click(object sender, System.EventArgs e)
{
EventLog ev = new EventLog("Application");
try
{
if (ev.Entries.Count > 0)
{
foreach (System.Diagnostics.EventLogEntry entry in ev.Entries)
{
ListBox1.Items.Add(entry.Message);
}
}
else
{
//MessageBox.Show("There are no entries in the log.");
ListBox1.Items.Add("Event Log Not Found...");
}
}
catch (Exception b)
{
Response.Write("ReadEntry " + b.Message + "<br>");
}
ev = null;
}
}
}
[실행 결과]
만약 위의 이벤트 로그 예제를 실행 시 오류가 Regstry 접근 오류가 발생 하면 아래의 내용대로 따라 하신 후 프로그램에서 이벤트 소스를 아래에서 작성 한 TEST로 한 후 실행 하시기 바랍니다.
아래의 예제를 하기 전에 Regedit에 여러 분의 애플리케이션 로그를 남길 수 있게 C# 이라는 이벤트 로그를 만들어 보도록 합니다.
레지스트리의 system current controlset service eventlog 아래에 C#이라고 subkey를 추가 하도록 하자.
그런다음 File이라는 값을 등록 시키자..
%SystemRoot%\system32\config\C#Event.Evt 라는 값으로…
결국 아래 그림 처럼 된다.
PRB: "Requested Registry Access Is Not Allowed" Error Message When ASP.NET Application Tries to Write New EventSource in the EventLog
적용 대상
This article was previously published under Q329291
IMPORTANT: This article contains information about modifying the registry. Before you modify the registry, make sure to back it up and make sure that you understand how to restore the registry if a problem occurs. For information about how to back up, restore, and edit the registry, click the following article number to view the article in the Microsoft Knowledge Base:
256986 Description of the Microsoft Windows Registry
SYMPTOMS
When you use ASP.NET to create a new event source in the event log, you may receive the following error message:
System.Security.SecurityException: Requested registry access is not allowed.
CAUSE
By default, the user token of the ASP.NET worker process is ASPNET (or NetworkService for applications that run on Internet Information Services [IIS] 6.0). The problem in the "Symptoms" section occurs because your account does not have the correct user rights to create an event source.
RESOLUTION
WARNING: If you use Registry Editor incorrectly, you may cause serious problems that may require you to reinstall your operating system. Microsoft cannot guarantee that you can solve problems that result from using Registry Editor incorrectly. Use Registry Editor at your own risk. To resolve this problem, a user who has administrative rights must create the event source before you run the ASP.NET Web Application. To create an event source, use one of the following approaches.
First Approach
Create an event source under the Application event log in Registry Editor. To do this, follow these steps:
1. Click Start, and then click Run.
2. In the Open text box, type regedit.
3. Locate the following registry subkey:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
4. Right-click the C# subkey, point to New, and then click Key.
5. Type C#Application for the key name.
6. Close Registry Editor.
Second Approach
The EventLogInstaller class in the System.Diagnostics namespace permits you to install and configure an event log that your application reads from or writes to while running. You can create an event source by using EventLogInstaller. To do this, follow these steps:
1. Use Microsoft Visual Basic .NET or Microsoft Visual C# .NET to create a new Class Library named EventLogSourceInstaller. By default, the Class1.vb file or the Class1.cs file is created.
2. In Solution Explorer, right-click EventLogSourceInstaller, and then click Add References.
3. In the Add Reference dialog box, double-click System.Configuration.Install.dll, and then click OK.
4. Rename the Class1.vb\Class1.cs to MyEventLogInstaller.vb\MyEventLogInstaller.cs.
5. Replace the existing code in MyEventLogInstaller.vb or MyEventLogInstaller.cs with the following sample code:
Visual Basic .NET Sample
6. Imports System.Diagnostics
7. Imports System.Configuration.Install
8. Imports System.ComponentModel
9.
10. <RunInstaller(True)> _
11. Public Class MyEventLogInstaller
12. Inherits Installer
13. Private myEventLogInstaller As EventLogInstaller
14.
15. Public Sub New()
16. ' Create an instance of 'EventLogInstaller'.
17. myEventLogInstaller = New EventLogInstaller()
18. ' Set the 'Source' of the event log, to be created.
19. myEventLogInstaller.Source = "TEST"
20. ' Set the 'Log' that the source is created in.
21. myEventLogInstaller.Log = "Application"
22. ' Add myEventLogInstaller to 'InstallerCollection'.
23. Installers.Add(myEventLogInstaller)
24. End Sub
25. End Class
Visual C# .NET Sample
using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Configuration.Install;
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 = "C#Application";
// Set the Log that source is created in
myEventLogInstaller.Log = "C#";
// Add myEventLogInstaller to the Installers Collection.
Installers.Add(myEventLogInstaller);
}
}
}
26. On the Build menu, click Build Solution to create EventLogSourceInstaller.dll.
27. Open the Visual Studio .NET Command Prompt.
28. At the command prompt, change to the folder where EventLogSourceInstaller.dll is located.
29. Run the following command to create the EventSource:
InstallUtil EventLogSourceInstaller.dll
MORE INFORMATION
Steps to Reproduce the Behavior
1. Use Visual Basic .NET or Visual C# .NET to create a new ASP.NET Web Application. By default, WebForm1.aspx file is created.
2. In the HTML view of WebForm1.aspx, replace the existing code with the following sample code:
Visual Basic .NET Sample
3. <%@ Page Language="vb" AutoEventWireup="true" %>
4. <%@ Import namespace="System.Diagnostics" %>
5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
6. <HTML>
7. <script language="VB" runat="server">
8. Sub WriteEvent_Click(Src As Object, e As EventArgs)
9. Dim ev As New EventLog("Application")
10. ' Event's Source name
11. ev.Source = "TEST"
12.
13. EventLog.CreateEventSource(ev.Source, "Application")
14.
15. Try
16. ev.WriteEntry(TextBox1.Text)
17. Catch b as exception
18. Response.write ("WriteEntry " & b.message & "<br>")
19. End Try
20. ev = Nothing
21. End Sub
22. </script>
23.
24. <body>
25. <form id="Form1" runat="server">
26. Event message:
27. <asp:textbox id="TextBox1" runat="server" Width="233px"></asp:textbox>
28. <asp:button id="Button1" [안내]태그제한으로등록되지않습니다-xxonclick="WriteEvent_Click" runat="server" NAME="Button1" text="Write to event log"></asp:button>
29. </form>
30. </body>
31. </HTML>
32.
Visual C# .NET Sample
33. <%@ Import Namespace="System.Diagnostics" %>
34. <%@ Page Language="C#" Debug="true" %>
35. <script Language="c#" runat="server" >
36. void EntrytoLog()
37. {
38. int[] array = new int[9];
39. for(int intCounter=0; intCounter <= 9;intCounter++)
40. {
41. array[intCounter] = intCounter;
42. Response.Write("카운터의 값:" + intCounter + "<br>");
43. }
44. }
45. void Page_Error(object sender, EventArgs e)
46. {
47. string errorMessage = "오류 발생:" + Server.GetLastError();
48. Server.ClearError();
49. string LogName = "C#";
50. string SourceName = "C#Application";
51.
52. if (!(EventLog.SourceExists(SourceName)))
53. {
54. EventLog.CreateEventSource(SourceName, LogName);
55. }
56. // 이벤트 로그에 추가
57. EventLog MyLog = new EventLog();
58. MyLog.Source = SourceName;
59. MyLog.WriteEntry(errorMessage, EventLogEntryType.Error);
60. }
61. </script>
62. <%
63. EntrytoLog();
64. %>
65.
On the Debug menu, click Start to view the WebForm1.aspx page in the browser.
Type some text in TextBox, and then click Write to event log.
The error message that is discussed in the "Symptoms" section of this article appears.
To resolve this problem, create an Event Source as discussed in the "Resolution" section, and comment the following code in WebForm1.aspx :
EventLog.CreateEventSource(ev.Source, "Application")
66. Repeat steps 3 and 4.
REFERENCES
For more information, visit the following Microsoft Web sites:
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