2014년 11월 18일 화요일

[강좌#8] 이벤트 로그(Event Log) 다루기[닷넷C#교육/ADO.NET강좌/ASP.NET교육잘하는곳/C#,ASP.NET교육추천/닷넷실무교육/.NET,C#/ADO.NET교육/닷넷학원/ASP.NET실무교육]

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" onclick="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" onclick="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 


 [100%환급,개발자전문]빅데이터/SQL/자바/스프링/안드로이드/닷…오라클자바…12-272520
 [채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육…오라클자바…12-111849
53 [평일100%환급7건]Spring,자바&JSP,안드로이드,웹퍼블리싱,C#닷… 오라클자바…03-151657
52 [주말]C#,ASP.NET마스터 오라클자바…01-311746
51 [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… 오라클자바…01-312516
50 [평일주간야간,주말]C기본&자료구조,알고리즘 오라클자바…01-311391
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정-… 오라클자바…01-191691
48 [평일야간,주말]안드로이드개발자과정(Android기초실무) 오라클자바…01-111579
47 [평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hiber… 오라클자바…01-032094
46 [100%환급,개발자전문]빅데이터/SQL/자바/스프링/안드로이드/닷… 오라클자바…12-272520
45 [평일주간]NoSQL,MongoDB,빅데이터기초과정 오라클자바…12-191808
44 [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… 오라클자바…12-141791
43 [채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육… 오라클자바…12-111849
42 [평일주간]빅데이터하둡기초과정(BigData Hadoop) 오라클자바…12-091451
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011674
40 [기업100%환급]오라클&자바웹스프링신입과정3주(SQL,JAVA,JSP,Se… 오라클자바…12-011849
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011320

댓글 없음:

댓글 쓰기