Cómo administrar registros de sucesos mediante Visual Basic .NET o Visual Basic 2005

Para una versión de Microsoft Visual C# .NET de este artículo, consulte
815314 .

Resumen

En este artículo paso a paso se describe cómo tener acceso y personalizar registros de sucesos de Windows mediante Microsoft.NET Framework. Puede interactuar con registros de eventos de Windows mediante la clase EventLog . Puede utilizar la clase EventLog para realizar las siguientes acciones:
  • Leer los registros existentes.
  • Escribir entradas en los registros de sucesos.
  • Crear o eliminar orígenes de eventos.
  • Eliminar los registros.
  • Responder a entradas del registro.
Este artículo también describe cómo crear nuevos registros mientras crea un origen de eventos.

Volver al principio

Requisitos


La lista siguiente describe el hardware recomendado, software, infraestructura de red y service packs que se necesitan:
  • Microsoft.NET Framework
  • Microsoft Visual Basic .NET o Microsoft Visual Basic 2005

En este artículo se supone que está familiarizado con los temas siguientes:
  • Microsoft Visual Basic .NET o Microsoft Visual Basic 2005 sintaxis
  • Microsoft Visual Studio .NET o el entorno de Microsoft Visual Studio 2005
  • Control de errores en.NET Framework
Volver al principio

Buscar los registros existentes en un equipo


Puede encontrar los registros existentes en un equipo mediante el método GetEventLogs compartida de la clase EventLog . El método GetEventLogs busca todos los registros de sucesos en el equipo local y, a continuación, crea una matriz de objetos EventLog que contiene la lista. En el ejemplo de código siguiente se recupera una lista de registros en el equipo local y, a continuación, muestra los nombres de los registros en una ventana de consola:
      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
Volver al principio

Leer y escribir registros en el Local y el sistema remoto


Leer registros


Para leer un registro de eventos, utilice la propiedad de las entradas de la clase EventLog . La propiedad de las entradas de la clase EventLog es una colección de todas las entradas en el registro de sucesos. En el ejemplo de código siguiente se muestra cómo recorrer en iteración esta colección y cómo leer todas las entradas en el registro especificado:
      ' 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()

Escribir registros


Para escribir un registro de eventos, utilice el método WriteEntry de la clase EventLog . Para escribir correctamente el registro de eventos, asegúrese de que la aplicación tenga acceso de escritura para el registro que está escribiendo. Para obtener más información acerca de los permisos que debe tener para leer y escribir en registros de sucesos, visite el siguiente sitio Web de Microsoft.

Ramificaciones de seguridad de registros de sucesos
http://msdn2.microsoft.com/en-us/library/4xz6w79h(vs.71).aspx
Debe establecer la propiedad Source en la instancia del componente EventLog antes de escribir entradas en un registro. Cuando el componente escriba una entrada, el sistema comprueba automáticamente que el origen especificado está registrado con el registro de eventos que el componente está escribiendo. A continuación, el sistema llamará a CreateEventSource si es necesario. Para escribir un registro de eventos, debe pasar el nombre del equipo donde reside el registro. En el ejemplo de código siguiente, la propiedad MachineName de la clase Environment determina el nombre del equipo local:
        ' 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()
Volver al principio

Borrar registros


Cuando un registro de eventos está lleno, se detiene la grabación de la nueva información de eventos o comienza a sobrescribir las entradas anteriores. Si detiene la grabación de eventos, puede borrar del registro las entradas existentes y permitir que se vuelva a iniciar la grabación de eventos. Para borrar entradas del registro de sucesos, debe tener permisos de administrador para el equipo en el que reside el registro. Llame al método Clear en la instancia del componente EventLog .

El siguiente código de ejemplo domonstrates cómo borrar un registro:
      ' 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()
Volver al principio

Crear y eliminar registros personalizados

Crear el registro personalizado

Utilice el método CreateEventSource para crear su propio controlador de eventos personalizado. Antes de crear el registro de eventos, utilice el método SourceExists para comprobar que está utilizando ya no existe y, a continuación, llamar a CreateEventSource. Si intenta crear un registro de eventos que ya existe, se produce un error System.ArgumentException .

En el ejemplo de código siguiente se muestra cómo crear un registro personalizado:
      ' 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

Eliminar el registro personalizado

Utilice el método Delete de la clase EventLog para eliminar el registro de sucesos. Más de un origen puede escribir en un registro de eventos. Por lo tanto, antes de eliminar un registro personalizado, asegúrese de que no hay ningún otros orígenes escribiendo en ese registro.

En el ejemplo de código siguiente se muestra cómo eliminar un registro personalizado:
      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
Volver al principio

Recibir notificaciones de eventos

Puede recibir una notificación de evento cuando se escribe una entrada a un registro determinado. Para ello, implemente el controlador de eventos EntryWritten para la instancia de EventLog . Asimismo, establezca la propiedad EnableRaisingEvents en true.

En el ejemplo de código siguiente se muestra cómo recibir las notificaciones de eventos:
      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
Nota: Sólo puede recibir notificaciones de eventos cuando se escriben entradas en el equipo local. No puede recibir notificaciones de entradas escritas en equipos remotos.

Volver al principio

Lista de código completa

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


Nota: Debe cambiar el código en Visual Basic 2005. De forma predeterminada, Visual Basic crea dos archivos para el proyecto cuando se crea un proyecto de formularios Windows Forms. Si el formulario se denomina Form1, los dos archivos que lo representan se denominan Form1.vb y Form1.Designer.vb. Usted escribe el código en el archivo Form1.vb. El Diseñador de Windows Forms escribe el código en el archivo Form1.Designer.vb. El Diseñador de Windows Forms utiliza la palabra clave partial para dividir la implementación de Form1 en dos archivos independientes. Este comportamiento evita que el código generado por el diseñador se mezcle con el código.

Para obtener más información acerca de las nuevas mejoras del lenguaje Visual Basic 2005, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

Para obtener más información sobre las clases parciales y el Diseñador de Windows Forms, visite el siguiente sitio Web de MSDN:

Volver al principio

Comprobar resultados

Para verificar los resultados, siga estos pasos:
  1. Cree una nueva aplicación de Windows mediante Visual Basic .NET o Visual Basic 2005.

    De forma predeterminada, se creará Form1.vb .
  2. Reemplace el código en Form1.vb con el código en la sección "Lista de código completa" de este artículo.
  3. En el menú Depurar , haga clic en
    Iniciar para ejecutar la aplicación.
  4. Realizar acciones en Form1.vb.
  5. Para comprobar el resultado, abra el Explorador de servidores. Para ello, haga clic en Explorador de servidores , en el menú Ver .
  6. Expanda el nodo servidores y, a continuación, expanda
    El nombre del equipo.
  7. En El nombre del equipo, expanda
    Registros de eventos.

    Nota: El nodo servidores del explorador de servidores no está disponible en Visual Basic .NET Academic Edition. Puede utilizar el Visor de sucesos de Windows para ver los resultados de la aplicación.
  8. Utilice el Explorador de servidores para comprobar que todos los pasos de este procedimiento se realizan correctamente.
Volver al principio

Referencias

Para obtener más información, visite el siguiente sitio Web de Microsoft:

EventLog (clase)
http://msdn2.microsoft.com/en-us/library/system.diagnostics.eventlog(vs.71).aspx

Volver al principio
Propiedades

Id. de artículo: 814564 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios