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

Para una versión de Microsoft Visual Basic .NET de este artículo, consulte
814564 .

Resumen

En este artículo paso a paso se describe cómo tener acceso y personalizar registros de sucesos de Windows mediante el Microsoft.NET Framework. Con la clase EventLog se puede interactuar con los registros de sucesos de Windows. Mediante la clase EventLog que puede leer los registros existentes, escribir entradas en el registro de eventos, crear o eliminar orígenes de eventos, eliminar registros y responder a entradas de registro. El artículo también describe cómo crear nuevos registros al crear 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:
  • El Microsoft.NET Framework
  • Microsoft Visual C# .NET o Microsoft Visual C# 2005.
En este artículo se supone que está familiarizado con los temas siguientes:
  • Microsoft Visual C# .NET o Microsoft Visual C# sintaxis de 2005
  • Microsoft Visual Studio .NET o el entorno de Microsoft Visual Studio 2005
  • Control de errores en el.NET Framework
Volver al principio

Buscar los registros existentes en un equipo


Puede buscar los registros existentes en un equipo mediante el método GetEventLogs de la clase EventLog . El método GetEventLogs busca todos los registros de sucesos en el equipo local y crea una matriz de objetos EventLog que contiene la lista. En el ejemplo siguiente se recupera una lista de registros en el equipo local y, a continuación, se muestra el nombre del registro en una ventana de consola.
EventLog[] remoteEventLogs; // Gets logs on the local computer, gives remote computer name to get the logs on the remote computer.
remoteEventLogs = EventLog.GetEventLogs(System.Environment.MachineName);
Console.WriteLine("Number of logs on computer: " + remoteEventLogs.Length);

for ( int i=0; i<remoteEventLogs.Length; i++ )
Console.WriteLine("Log: " + remoteEventLogs[i].Log);

Volver al principio

Leer y escribir registros en el sistema Local y remoto

Leer registros

Para leer un registro de eventos, utilice las propiedades de las entradas de la clase EventLog . La clase EventLog propiedad Entries es una colección de todas las entradas en el registro de sucesos. Puede recorrer en iteración esta colección y leer todas las entradas en el registro especificado. El código siguiente muestra cómo hacerlo:
      //logType can be Application, Security, System or any other Custom Log.
string logType = "Application";

EventLog ev = new EventLog(logType, System.Environment.MachineName);
int LastLogToShow = ev.Entries.Count;
if ( LastLogToShow <= 0 )
Console.WriteLine("No Event Logs in the Log :" + logType);

// Read the last 2 records in the specified log.
int i;
for ( i = ev.Entries.Count - 1; i>= LastLogToShow - 2; i--)
{
EventLogEntry CurrentEntry = ev.Entries[i];
Console.WriteLine("Event ID : " + CurrentEntry.EventID);
Console.WriteLine("Entry Type : " + CurrentEntry.EntryType.ToString());
Console.WriteLine("Message : " + CurrentEntry.Message + "\n");
}
ev.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, la aplicación debe tener acceso de escritura en el registro que está intentando escribir. Para obtener más información acerca de los permisos que debe tener para leer y escribir en un registro de eventos, 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 automáticamente comprueba para ver si el origen especificado está registrado con el registro de eventos que está escribiendo el componente y llamará a CreateEventSource (si debe llamarse a CreateEventSource ).
  //See if the source exists. 
if ( ! ( EventLog.SourceExists("MySystemSource", System.Environment.MachineName)))
EventLog.CreateEventSource("MySystemSource", "System", System.Environment.MachineName);

EventLog ev = 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, 10001);
MessageBox.Show("Warning is written to System Log");
ev.Close();
Volver al principio

Borrar registros

Cuando un registro de eventos está lleno, deja de grabar 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 el inicio de sesión iniciar de nuevo el registro de eventos. Llame al método Clear en la instancia del componente de registro de sucesos.

Nota: Para borrar entradas del registro de sucesos, debe tener permisos de administrador en el equipo donde está el registro.
     //Create an EventLog instance and pass log name and MachineName where the log resides.
EventLog ev = new EventLog("Security", System.Environment.MachineName);
ev.Clear();
ev.Close();
Volver al principio

Crear y eliminar registros personalizados

Crear el registro personalizado

Puede utilizar el método CreateEventSource para crear su propio controlador de eventos personalizado. Antes de crear un registro de eventos, utilice el método SourceExists para comprobar que la fuente que está utilizando ya no existe y, a continuación, llame a la CreateEventSource. Si se intenta crear un registro de eventos que ya existe, se produce la excepción System.ArgumentException .
     // Create the source, if it does not already exist.
if (! (EventLog.SourceExists("MyOldSource", System.Environment.MachineName)))
EventLog.CreateEventSource("MyOldSource", "MyNewLog", System.Environment.MachineName);
Console.WriteLine("CreatingEventSource");

Eliminar el registro personalizado

Para eliminar el registro de eventos, puede utilizar el método Delete de la clase EventLog . 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 existen otras fuentes que están escribiendo en ese registro.
     string logName = "MyNewLog";
if ( EventLog.SourceExists("MyOldSource", System.Environment.MachineName))
{
logName = EventLog.LogNameFromSourceName("MyOldSource", System.Environment.MachineName);
EventLog.DeleteEventSource("MyOldSource", System.Environment.MachineName);
EventLog.Delete(logName, System.Environment.MachineName);
Console.WriteLine(logName + " deleted.");
}
Volver al principio

Recibir notificaciones de eventos

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

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

using System;using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Security;
using System.IO;
using System.Diagnostics;

namespace WindowsApplication1
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Diagnostics.EventLog eventLog1;
private System.Windows.Forms.Button btnListLog;
private System.Windows.Forms.Button btnReadLog;
private System.Windows.Forms.Button btnWriteLog;
private System.Windows.Forms.Button btnClearLog;
private System.Windows.Forms.Button btnCreateLog;
private System.Windows.Forms.Button btnDeleteLog;
private System.Windows.Forms.Button btnRecNotice;

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support.
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call.
//
}

/// <summary>
/// Clean up any resources that are being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.eventLog1 = new System.Diagnostics.EventLog();
this.btnListLog = new System.Windows.Forms.Button();
this.btnReadLog = new System.Windows.Forms.Button();
this.btnWriteLog = new System.Windows.Forms.Button();
this.btnClearLog = new System.Windows.Forms.Button();
this.btnCreateLog = new System.Windows.Forms.Button();
this.btnDeleteLog = new System.Windows.Forms.Button();
this.btnRecNotice = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
this.SuspendLayout();
//
// eventLog1
//
this.eventLog1.MachineName = System.Environment.MachineName;
this.eventLog1.SynchronizingObject = this;
this.eventLog1.EntryWritten += new System.Diagnostics.EntryWrittenEventHandler(this.eventLog1_EntryWritten);

//
// btnListLog
//
this.btnListLog.Location = new System.Drawing.Point(32, 16);
this.btnListLog.Name = "btnListLog";
this.btnListLog.Size = new System.Drawing.Size(152, 23);
this.btnListLog.TabIndex = 0;
this.btnListLog.Text = "List Event Logs";
this.btnListLog.Click += new System.EventHandler(this.btnListLog_Click);
//
// btnReadLog
//
this.btnReadLog.Location = new System.Drawing.Point(32, 46);
this.btnReadLog.Name = "btnReadLog";
this.btnReadLog.Size = new System.Drawing.Size(152, 23);
this.btnReadLog.TabIndex = 1;
this.btnReadLog.Text = "Read Event Logs";
this.btnReadLog.Click += new System.EventHandler(this.btnReadLog_Click);
//
// btnWriteLog
//
this.btnWriteLog.Location = new System.Drawing.Point(32, 77);
this.btnWriteLog.Name = "btnWriteLog";
this.btnWriteLog.Size = new System.Drawing.Size(152, 23);
this.btnWriteLog.TabIndex = 2;
this.btnWriteLog.Text = "Write Event Logs";
this.btnWriteLog.Click += new System.EventHandler(this.btnWriteLog_Click);

//
// btnClearLog
//
this.btnClearLog.Location = new System.Drawing.Point(32, 106);
this.btnClearLog.Name = "btnClearLog";
this.btnClearLog.Size = new System.Drawing.Size(152, 23);
this.btnClearLog.TabIndex = 3;
this.btnClearLog.Text = "Clear Logs";
this.btnClearLog.Click += new System.EventHandler(this.btnClearLog_Click);

//
// btnCreateLog
//
this.btnCreateLog.Location = new System.Drawing.Point(32, 137);
this.btnCreateLog.Name = "btnCreateLog";
this.btnCreateLog.Size = new System.Drawing.Size(152, 23);
this.btnCreateLog.TabIndex = 4;
this.btnCreateLog.Text = "Create Custom Logs";
this.btnCreateLog.Click += new System.EventHandler(this.btnCreateLog_Click);

//
// btnDeleteLog
//
this.btnDeleteLog.Location = new System.Drawing.Point(32, 168);
this.btnDeleteLog.Name = "btnDeleteLog";
this.btnDeleteLog.Size = new System.Drawing.Size(152, 23);
this.btnDeleteLog.TabIndex = 5;
this.btnDeleteLog.Text = "Delete Custom Logs";
this.btnDeleteLog.Click += new System.EventHandler(this.btnDeleteLog_Click);
//
// btnRecNotice
//
this.btnRecNotice.Location = new System.Drawing.Point(32, 199);
this.btnRecNotice.Name = "btnRecNotice";
this.btnRecNotice.Size = new System.Drawing.Size(152, 23);
this.btnRecNotice.TabIndex = 6;
this.btnRecNotice.Text = "Receive Event Notifications";
this.btnRecNotice.Click += new System.EventHandler(this.btnRecNotice_Click);

//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(216, 237);
this.Controls.Add(this.btnRecNotice);
this.Controls.Add(this.btnDeleteLog);
this.Controls.Add(this.btnCreateLog);
this.Controls.Add(this.btnClearLog);
this.Controls.Add(this.btnWriteLog);
this.Controls.Add(this.btnReadLog);
this.Controls.Add(this.btnListLog);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void btnListLog_Click(object sender, System.EventArgs e)
{
EventLog[] remoteEventLogs;
// Gets logs on the local computer, gives remote computer name to get the logs on the remote computer.
remoteEventLogs = EventLog.GetEventLogs(System.Environment.MachineName);

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

for ( int i=0; i<remoteEventLogs.Length; i++ )
Console.WriteLine("Log: " + remoteEventLogs[i].Log);
}

private void btnReadLog_Click(object sender, System.EventArgs e)
{

//logType can be Application, Security, System or any other Custom Log.
string logType = "Application";

/* In this case the EventLog constructor is passed a string variable for the log name and
* second argument mention the computer name that you want to read the logs from,
* and that you have appropriate permissions to*/

EventLog ev = new EventLog(logType, System.Environment.MachineName);

int LastLogToShow = ev.Entries.Count;
if ( LastLogToShow <= 0 )
Console.WriteLine("No Event Logs in the Log :" + logType);
// Read the last 2 record in the specified log.
int i;
for ( i = ev.Entries.Count - 1; i>= LastLogToShow - 2; i--)
{
EventLogEntry CurrentEntry = ev.Entries[i];
Console.WriteLine("Event ID : " + CurrentEntry.EventID);
Console.WriteLine("Entry Type : " + CurrentEntry.EntryType.ToString());
Console.WriteLine("Message : " + CurrentEntry.Message + "\n");
}

ev.Close();

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

private void btnWriteLog_Click(object sender, System.EventArgs e)
{
/* When writing to an event log, pass the computer name where
* the log resides. Here the MachineName Property of the Environment class
* is used to determine the name of the local computer. Assuming that you have
* the appropriate permissions, it is also easy to write to event logs on
* other computers.*/

//See if the Source exists.
if ( ! ( EventLog.SourceExists("MySystemSource", System.Environment.MachineName)))
EventLog.CreateEventSource("MySystemSource", "System", System.Environment.MachineName);

EventLog ev = 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, 10001);
MessageBox.Show("Warning is written to System Log");
ev.Close();
}

private void btnClearLog_Click(object sender, System.EventArgs e)
{
//Create an EventLog instance, and pass log name and MachineName where the log resides.
EventLog ev = new EventLog("Security", System.Environment.MachineName);
ev.Clear();
ev.Close();
}

private void btnCreateLog_Click(object sender, System.EventArgs e)
{
// Create the source, if it does not already exist.
if (! (EventLog.SourceExists("MyOldSource", System.Environment.MachineName)))
// Creating a new log
EventLog.CreateEventSource("MyOldSource", "MyNewLog", System.Environment.MachineName);
Console.WriteLine("CreatingEventSource");
}

private void btnDeleteLog_Click(object sender, System.EventArgs e)
{
string logName = "MyNewLog";

if ( EventLog.SourceExists("MyOldSource", System.Environment.MachineName))
{
logName = EventLog.LogNameFromSourceName("MyOldSource", System.Environment.MachineName);
EventLog.DeleteEventSource("MyOldSource", System.Environment.MachineName);
EventLog.Delete(logName, System.Environment.MachineName);
Console.WriteLine(logName + " deleted.");
}
}

private void btnRecNotice_Click(object sender, System.EventArgs e)
{
// Create the source, if it does not already exist.
if (EventLog.SourceExists("MySource", System.Environment.MachineName) == false)
{
EventLog.CreateEventSource("MySource", "Application", System.Environment.MachineName);
Console.WriteLine("CreatingEventSource");
}

eventLog1.Log = "Application";
//Enable EnableRaisingEvents to true
eventLog1.EnableRaisingEvents = true;
EventLog.WriteEntry("MySource", "EntryWritten event is fired", EventLogEntryType.Information);
}

private void eventLog1_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
if (e.Entry.Source == "MySource")
Console.WriteLine("Entry written by my app. Message: " + e.Entry.Message);
}
}
}


Volver al principio

Comprobar los resultados

Para comprobar los resultados, siga estos pasos:
  1. En Microsoft Visual Studio .NET o Microsoft Visual Studio 2005, cree un nuevo proyecto de Visual C# Visual C# 2005 aplicación Windows .NET o. De forma predeterminada, se creará Form1.vb.
  2. Reemplace el código en Form1.vb con el código que aparece 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 diversas acciones en el formulario.
  5. En el menú Ver , haga clic en Explorador de servidores para comprobar los resultados.
  6. Expanda servidoresy, 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 el Academic Edition de Visual C#. NET. En tales casos, puede utilizar el Visor de sucesos de Windows para ver los resultados de la aplicación.
  8. Compruebe el Explorador de servidores para comprobar que todas las tareas se realizan correctamente.
Volver al principio

Referencias

Para obtener más información, visite el siguiente sitio Web de Microsoft:volver al principio Nº de error: 4852 (Mantenimiento de contenido)
Propiedades

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

Comentarios