كيفية إدارة سجلات الأحداث باستخدام Visual Basic.NET أو Visual Basic 2005

للحصول على إصدار Microsoft Visual C#.NET من هذه المقالة، راجع
815314 .

ملخص

توضح هذه المقالة خطوة بخطوة كيفية الوصول وتخصيص سجلات أحداث Windows باستخدام Microsoft.NET Framework. يمكنك التفاعل مع سجلات أحداث Windows باستخدام فئة سجل الأحداث . يمكنك استخدام فئة سجل الأحداث للقيام بالإجراءات التالية:
  • قراءة من سجلات موجودة.
  • كتابة إدخالات سجلات الأحداث.
  • إنشاء أو حذف مصادر الأحداث.
  • حذف السجلات.
  • الاستجابة لتسجيل إدخالات.
توضح هذه المقالة أيضا كيفية إنشاء سجلات جديدة أثناء إنشاء مصدر حدث.

العودة إلى أعلى

متطلبات


توضح القائمة التالية الأجهزة الموصى بها برامج البنية الأساسية للشبكة وحزم الخدمات المطلوبة:
  • Microsoft.NET Framework
  • Microsoft Visual Basic.NET أو Microsoft Visual Basic 2005

تفترض هذه المقالة أنك معتاد على المواضيع التالية:
  • Microsoft Visual Basic.NET أو بناء جملة Microsoft Visual Basic 2005
  • Microsoft Visual Studio.NET أو Microsoft Visual Studio 2005 البيئة
  • معالجة الأخطاء في.NET Framework
العودة إلى أعلى

البحث عن السجلات الموجودة على الكمبيوتر


تجد السجلات الموجودة على جهاز كمبيوتر باستخدام أسلوب GetEventLogs المشتركة لفئة سجل الأحداث . أسلوب GetEventLogs يبحث عن كافة سجلات الأحداث على الكمبيوتر المحلي ومن ثم يقوم بإنشاء صفيف من كائنات سجل الأحداث التي تحتوي على القائمة. مثال التعليمات البرمجية التالي استرداد قائمة سجلات على الكمبيوتر المحلي، ويعرض أسماء السجلات في إطار وحدة تحكم:
      Dim remoteEventLogs() As EventLog
'Gets logs on the local machine, give remote machine name to get the logs on the remote machine
remoteEventLogs = EventLog.GetEventLogs(System.Environment.MachineName)

Console.WriteLine("Number of logs on computer: " & remoteEventLogs.Length)

'Display the list of event logs
Dim log As EventLog
For Each log In remoteEventLogs
Console.WriteLine("Log: " & log.Log)
Next log
العودة إلى أعلى

قراءة وكتابة سجلات إلى ومن النظام البعيد والمحلي


قراءة سجلات


لقراءة سجل الأحداث، استخدم خاصية إدخالات فئة سجل الأحداث . خاصية إدخالات فئة سجل الأحداث مجموعة من كافة الإدخالات في سجل الأحداث. يوضح المثال التعليمات البرمجية التالي كيفية يكرر خلال هذه المجموعة وكيفية قراءة كافة الإدخالات الموجودة في السجل المحدد:
      ' Log type can be Application, Security, System or any other custom log      ' Select the log type you want to read
Dim logtype As String = "Application"

' In the constructor of the eventlog, pass the log type and the computer name
' from which you want to read the logs
Dim evtLog As New EventLog(logtype, System.Environment.MachineName)

Dim lastlogtoshow As Integer = evtLog.Entries.Count
If lastlogtoshow <= 0 Then
Console.WriteLine("There are no event logs in the log : " & logtype)
Exit Sub
End If

' Read the last record in the specified log
Dim currentEntry As EventLogEntry
Dim i As Integer
' Show Last 2 entries. You can similarly write the log to a file.
For i = evtLog.Entries.Count - 1 To lastlogtoshow - 2 Step -1
currentEntry = evtLog.Entries(i)
Console.WriteLine("Event Id is : " & currentEntry.EventID)
Console.WriteLine("Entry type is : " & currentEntry.EntryType.ToString())
Console.WriteLine("Message is : " & currentEntry.Message & vbCrLf)
Next
evtLog.Close()

كتابة سجلات


لكتابة سجل الأحداث، استخدم أسلوب WriteEntry الفئة سجل الأحداث . لكتابة سجل الأحداث بنجاح، تأكد من أن التطبيق الخاص بك لديه حق الوصول للكتابة إلى السجل. لمزيد من المعلومات حول الأذونات التي يجب أن يكون لديك للقراءة والكتابة في سجلات الأحداث، قم بزيارة موقع Microsoft التالي على الويب.

تفرع الأمان من سجلات الأحداث
http://msdn2.microsoft.com/en-us/library/4xz6w79h(vs.71).aspx
يجب تعيين خاصية المصدر على مثيل مكون سجل الأحداث الخاص بك قبل كتابة إدخالات إلى سجل. عندما يكتب المكون الخاص بك إدخال، يتحقق النظام تلقائياً من أن المصدر المحدد مسجل المكون الكتابة إلى سجل الأحداث. ثم استدعاء النظام CreateEventSource إذا لزم الأمر. لكتابة سجل الأحداث، يجب تمرير اسم الجهاز حيث يوجد السجل. في مثال التعليمات البرمجية التالي خاصية اسم الجهاز لفئة البيئة يحدد اسم الجهاز المحلي:
        ' Check if the source exists 
If Not EventLog.SourceExists("MySystemSource", System.Environment.MachineName) Then
EventLog.CreateEventSource("MySystemSource", "System", System.Environment.MachineName)
End If

Dim evtLog As New EventLog("System", System.Environment.MachineName, "MySystemSource")

'writing to system log, in the similar way you can write to other
'logs for which you have appropriate permissions to write
evtLog.WriteEntry("warning is written to system log", EventLogEntryType.Warning, CInt(10001))
Console.WriteLine("Log written to the system log.")
evtLog.Close()
العودة إلى أعلى

مسح سجلات


عند امتلاء سجل الأحداث، فإنه يتوقف على تسجيل معلومات الحدث الجديد أو تبدأ في الكتابة فوق الإدخالات السابقة. إذا توقف تسجيل الحدث، يمكنك مسح تسجيل الإدخالات الموجودة والسماح ببدء تسجيل الأحداث مرة أخرى. لمسح إدخالات سجل الأحداث، يجب عليك أذونات المسؤول على الكمبيوتر الذي عليه هذا السجل. استدعاء الأسلوب مسح على مثيل مكون سجل الأحداث .

التعليمة البرمجية التالية دومونستراتيس المثال كيفية مسح سجل:
      ' Create an EventLog instance and pass log name and MachineName on which the log resides      Dim evtLog As New EventLog("Security", System.Environment.MachineName)
evtLog.Clear()
evtLog.Close()
العودة إلى أعلى

إنشاء وحذف السجلات المخصصة

إنشاء سجل مخصص

استخدم الأسلوب CreateEventSource لإنشاء معالج الحدث المخصص الخاص بك. قبل أن تقوم بإنشاء سجل الأحداث، استخدم الأسلوب سورسيكسيستس للتحقق من أن المصدر الذي تستخدمه لم تكن بالفعل موجودة، ثم قم باستدعاء CreateEventSource. إذا حاولت إنشاء سجل الأحداث بالفعل، يتم طرح خطأ في System.ArgumentException .

يوضح مثال التعليمات البرمجية التالي كيفية إنشاء تسجيل مخصص:
      ' Check if the log already exist      If Not EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
' Creating a new log
EventLog.CreateEventSource("MyOldSource", "MyNewLog", System.Environment.MachineName)
Console.WriteLine("New event log created successfully.")
End If

حذف سجل مخصص

استخدم طريقة حذف فئة سجل الأحداث لحذف سجل الأحداث. يمكن كتابة أكثر من مصدر واحد إلى سجل الأحداث. لذلك، قبل حذف سجل مخصص، تأكد من وجود أية مصادر الكتابة إلى هذا السجل.

يوضح المثال التعليمات البرمجية التالي كيفية حذف سجل مخصص:
      Dim logName As String = "MyNewLog"
If EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
logName = EventLog.LogNameFromSourceName("MyOldSource", System.Environment.MachineName)
EventLog.DeleteEventSource("MyOldSource", System.Environment.MachineName)
EventLog.Delete(logName, System.Environment.MachineName)

Console.WriteLine(logName & " deleted.")
End If
العودة إلى أعلى

تلقي إعلامات أحداث

يمكنك تلقي إعلام حدث عند كتابة إدخال إلى سجل معين. للقيام بذلك، تطبيق معالج الحدث انتريوريتين لمثيل سجل الأحداث . أيضا، يمكنك تعيين الخاصية انابليرايسينجيفينتس إلى true.

مثال التعليمات البرمجية التالي يوضح كيفية تلقي إعلامات أحداث:
      If Not EventLog1.SourceExists("MySource", System.Environment.MachineName) Then         EventLog1.CreateEventSource("MySource", "Application", System.Environment.MachineName)
Console.WriteLine("CreatingEventSource")
End If

'Enable EnableRaisingEvents to true
EventLog1.Log = "Application"
EventLog1.EnableRaisingEvents = True
EventLog1.WriteEntry("MySource", "EntryWritten event is fired", EventLogEntryType.Information)
End Sub
ملاحظة: أن تتلقى إعلامات أحداث عند إدخالات مكتوبة على الكمبيوتر المحلي فقط. لا يمكن تلقي إعلامات للإدخالات التي تمت كتابتها على أجهزة الكمبيوتر البعيدة.

العودة إلى أعلى

إتمام سرد التعليمات البرمجية

Imports System.DiagnosticsImports System.Security
Imports System.ComponentModel
Imports System.IO

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()

'The Windows Form Designer requires this call.
InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The Windows Form Designer requires the following procedure
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents EventLog1 As System.Diagnostics.EventLog
Friend WithEvents btnListLog As System.Windows.Forms.Button
Friend WithEvents btnReadLog As System.Windows.Forms.Button
Friend WithEvents btnWriteLog As System.Windows.Forms.Button
Friend WithEvents btnClearLog As System.Windows.Forms.Button
Friend WithEvents btnCreateLog As System.Windows.Forms.Button
Friend WithEvents btnDeleteLog As System.Windows.Forms.Button
Friend WithEvents btnRecNotice As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.btnReadLog = New System.Windows.Forms.Button()
Me.btnWriteLog = New System.Windows.Forms.Button()
Me.btnClearLog = New System.Windows.Forms.Button()
Me.btnCreateLog = New System.Windows.Forms.Button()
Me.btnDeleteLog = New System.Windows.Forms.Button()
Me.btnRecNotice = New System.Windows.Forms.Button()
Me.EventLog1 = New System.Diagnostics.EventLog()
Me.btnListLog = New System.Windows.Forms.Button()
CType(Me.EventLog1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'btnReadLog
'
Me.btnReadLog.Location = New System.Drawing.Point(48, 54)
Me.btnReadLog.Name = "btnReadLog"
Me.btnReadLog.Size = New System.Drawing.Size(152, 24)
Me.btnReadLog.TabIndex = 0
Me.btnReadLog.Text = "Read Event Logs"
'
'btnWriteLog
'
Me.btnWriteLog.Location = New System.Drawing.Point(48, 86)
Me.btnWriteLog.Name = "btnWriteLog"
Me.btnWriteLog.Size = New System.Drawing.Size(152, 24)
Me.btnWriteLog.TabIndex = 1
Me.btnWriteLog.Text = "Write Event Logs"
'
'btnClearLog
'
Me.btnClearLog.Location = New System.Drawing.Point(48, 118)
Me.btnClearLog.Name = "btnClearLog"
Me.btnClearLog.Size = New System.Drawing.Size(152, 24)
Me.btnClearLog.TabIndex = 2
Me.btnClearLog.Text = "Clear Logs"
'
'btnCreateLog
'
Me.btnCreateLog.Location = New System.Drawing.Point(48, 150)
Me.btnCreateLog.Name = "btnCreateLog"
Me.btnCreateLog.Size = New System.Drawing.Size(152, 24)
Me.btnCreateLog.TabIndex = 3
Me.btnCreateLog.Text = "Create Custom Log"
'
'btnDeleteLog
'
Me.btnDeleteLog.Location = New System.Drawing.Point(48, 182)
Me.btnDeleteLog.Name = "btnDeleteLog"
Me.btnDeleteLog.Size = New System.Drawing.Size(152, 24)
Me.btnDeleteLog.TabIndex = 4
Me.btnDeleteLog.Text = "Delete Custom Log"
'
'btnRecNotice
'
Me.btnRecNotice.Location = New System.Drawing.Point(48, 214)
Me.btnRecNotice.Name = "btnRecNotice"
Me.btnRecNotice.Size = New System.Drawing.Size(152, 24)
Me.btnRecNotice.TabIndex = 5
Me.btnRecNotice.Text = "Receive Event Notifications"
'
'EventLog1
'
Me.EventLog1.EnableRaisingEvents = True
Me.EventLog1.Log = "Application"
Me.EventLog1.MachineName = System.Environment.MachineName
Me.EventLog1.SynchronizingObject = Me
'
'btnListLog
'
Me.btnListLog.Location = New System.Drawing.Point(48, 22)
Me.btnListLog.Name = "btnListLog"
Me.btnListLog.Size = New System.Drawing.Size(152, 24)
Me.btnListLog.TabIndex = 6
Me.btnListLog.Text = "List Event Logs"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(256, 266)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.btnListLog, Me.btnRecNotice, Me.btnDeleteLog, Me.btnCreateLog, Me.btnClearLog, Me.btnWriteLog, Me.btnReadLog})
Me.Name = "Form1"
Me.Text = "Form1"
CType(Me.EventLog1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub btnReadLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReadLog.Click

'logType can be Application, Security, System or any other Custom Log
Dim logType As String = "Application"


'In this case the EventLog constructor is passed a string variable for the log name and
'second argument mention the computer name from which you want to read the logs
'that you have appropriate permissions for
Dim ev As New EventLog(logType, System.Environment.MachineName)

Dim LastLogToShow As Integer = ev.Entries.Count
If LastLogToShow <= 0 Then
Console.WriteLine("No Event Logs in the Log :" & logType)
Exit Sub
End If

' read the last 2 records in the specified log
Dim i As Integer
For i = ev.Entries.Count - 1 To LastLogToShow - 2 Step -1
Dim CurrentEntry As EventLogEntry = ev.Entries(i)

Console.WriteLine("Event ID : " & CurrentEntry.EventID)
Console.WriteLine("Entry Type : " & CurrentEntry.EntryType.ToString())
Console.WriteLine("Message : " & CurrentEntry.Message & vbCrLf)
Next

ev.Close()

' Similarly, you can loop through all the entries in the log by using
' the entries collection, as shown in the following commented code.
' For Each entry In ev.Entries

' Next
End Sub

Private Sub btnWriteLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteLog.Click
' When writing to an event log, you must pass the machine name where
' the log resides. Here the MachineName Property of the Environment class
' is used to determine the name of the local machine. Assuming you have
' the appropriate permissions, it is also easy to write to event logs on
' other machines.

'Check if the Source exists
If Not EventLog.SourceExists("MySystemSource", System.Environment.MachineName) Then
EventLog.CreateEventSource("MySystemSource", "System", System.Environment.MachineName)
End If
Dim ev As New EventLog("System", System.Environment.MachineName, "MySystemSource")

'Writing to system log, in the similar way you can write to other
'logs that you have appropriate permissions to write to
ev.WriteEntry("Warning is written to system Log", EventLogEntryType.Warning, CInt(10001))
MessageBox.Show("Warning is written to System Log")
ev.Close()

End Sub

Private Sub btnClearLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClearLog.Click
' Create an EventLog instance and pass the log name and MachineName on which the log resides.
Dim ev As New EventLog("Security", System.Environment.MachineName)
ev.Clear()
ev.Close()
End Sub

Private Sub btnCreateLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreateLog.Click
'Create the source, if it does not already exist.
If Not EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
'Creating a new log
EventLog.CreateEventSource("MyOldSource", "MyNewLog", System.Environment.MachineName)
Console.WriteLine("CreatingEventSource")
End If
End Sub

Private Sub btnDeleteLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeleteLog.Click
Dim logName As String = "MyNewLog"

If EventLog.SourceExists("MyOldSource", System.Environment.MachineName) Then
logName = EventLog.LogNameFromSourceName("MyOldSource", System.Environment.MachineName)
EventLog.DeleteEventSource("MyOldSource", System.Environment.MachineName)
EventLog.Delete(logName, System.Environment.MachineName)

Console.WriteLine(logName & " deleted.")
End If

End Sub


Private Sub btnRecNotice_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRecNotice.Click
' Create the source if it does not already exist.
If Not EventLog1.SourceExists("MySource", System.Environment.MachineName) Then
EventLog1.CreateEventSource("MySource", "Application", System.Environment.MachineName)
Console.WriteLine("CreatingEventSource")
End If

'Enable EnableRaisingEvents to true
EventLog1.Log = "Application"
EventLog1.EnableRaisingEvents = True
EventLog1.WriteEntry("MySource", "EntryWritten event is fired", EventLogEntryType.Information)
End Sub

Private Sub EventLog1_EntryWritten(ByVal sender As Object, ByVal e As System.Diagnostics.EntryWrittenEventArgs) Handles EventLog1.EntryWritten
If e.Entry.Source = "MySource" Then
Console.WriteLine("Entry written by my app. Message: " & e.Entry.Message)
End If
End Sub

Private Sub btnListLog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListLog.Click
Dim remoteEventLogs() As EventLog
'Gets logs on the local machine, give remote machine name to get the logs on the remote machine
remoteEventLogs = EventLog.GetEventLogs(System.Environment.MachineName)

Console.WriteLine("Number of logs on computer: " & remoteEventLogs.Length)

Dim log As EventLog
For Each log In remoteEventLogs
Console.WriteLine("Log: " & log.Log)
Next log
End Sub
End Class


ملاحظة: يجب تغيير التعليمات البرمجية في Visual Basic 2005. بشكل افتراضي، Visual Basic إنشاء ملفين للمشروع عند إنشاء مشروع Windows Forms. إذا تم تسمية النموذج Form1، الملفين تمثل النموذج تسمية Form1.vb و Form1.Designer.vb. كتابة التعليمات البرمجية في الملف Form1.vb. مصمم نماذج Windows بكتابة التعليمات البرمجية في ملف Form1.Designer.vb. مصمم نماذج Windows يستخدم الكلمة الأساسية الجزئية لتقسيم تطبيق Form1 إلى ملفين مستقلين. يمنع هذا السلوك التعليمة البرمجية التي تم إنشاؤها من قبل مصمم يتم interspersed مع التعليمات البرمجية الخاصة بك.

لمزيد من المعلومات حول التحسينات لغة Visual Basic 2005 جديد، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:

لمزيد من المعلومات حول فئات جزئية ومصمم نماذج Windows، قم بزيارة موقع Msdn التالي:

العودة إلى أعلى

التحقق من النتائج

ل verfiy النتائج الخاصة بك، اتبع الخطوات التالية:
  1. إنشاء تطبيق Windows جديد باستخدام Visual Basic.NET أو Visual Basic 2005.

    بشكل افتراضي، يتم إنشاء Form1.vb .
  2. استبدال التعليمات البرمجية في Form1.vb مع التعليمات البرمجية في مقطع "سرد التعليمات البرمجية الكاملة" من هذه المقالة.
  3. في القائمة " تصحيح "، انقر فوق
    بدء تشغيل التطبيق.
  4. تنفيذ إجراءات على Form1.vb.
  5. للتحقق من النتيجة، افتح "مستكشف الملقم". للقيام بذلك، انقر فوق "مستكشف الملقم" في القائمة عرض .
  6. قم بتوسيع عقده ملقمات ثم قم بتوسيع
    اسم الكمبيوتر الخاص بك.
  7. ضمن اسم الكمبيوتر الخاص بك، قم بتوسيع
    سجلات الأحداث.

    ملاحظة: عقده ملقمات "مستكشف الخادم" غير متوفر في "إصدار Visual Basic.NET الأكاديمية". يمكنك استخدام عارض أحداث Windows لعرض النتائج للتطبيق الخاص بك.
  8. استخدم "مستكشف الملقم" للتحقق من أنه يتم تنفيذ كافة الخطوات في هذا الإجراء بشكل صحيح.
العودة إلى أعلى

المراجع

لمزيد من المعلومات، قم بزيارة موقع Microsoft التالي على الويب:

فئة سجل الأحداث
http://msdn2.microsoft.com/en-us/library/system.diagnostics.eventlog(vs.71).aspx

العودة إلى أعلى
خصائص

رقم الموضوع: 814564 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات