Jak spravovat protokoly událostí pomocí Visual C# .NET nebo Visual C# 2005

Překlady článku Překlady článku
ID článku: 815314 - Produkty, které se vztahují k tomuto článku.
Microsoft Visual Basic .NET verzi tohoto článku naleznete 814564.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento podrobný článek popisuje přístup a upravit pomocí Microsoft .NET Framework protokoly událostí systému Windows. Třída EventLog můžete pracovat s protokoly událostí systému Windows. Pomocí EventLog třídy z existujících protokolů můžete číst, zapisovat položky protokolu událostí, vytvořit nebo odstranit zdrojů událostí, odstranit protokoly a odpovídat na položky protokolu. Článek také popisuje jak vytvořit nové protokoly při vytváření zdroje událostí.

Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu a požadované aktualizace Service Pack:
  • Microsoft .NET Framework
  • Microsoft Visual C# .NET nebo Microsoft Visual C# 2005.
Tento článek předpokládá znalost následujících témat:
  • Microsoft Visual C# .NET nebo Microsoft Visual C# 2005 syntaxe
  • prostředí aplikace Microsoft Visual Studio .NET nebo Microsoft Visual Studio 2005
  • Chyba zpracování .NET Framework

Najít existující protokolování v počítači


Existující protokoly můžete najít v počítači pomocí sdílené metody GetEventLogs třídy EventLog. Metoda GetEventLogs vyhledá všechny protokoly událostí v místním počítači a vytvoří matici EventLog objekty, které obsahují seznam. Následující příklad načte seznam protokolů na místním počítači a zobrazí název protokolu v okně konzoly.
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);

Číst a zapisovat protokoly místního a vzdáleného systému

Čtení protokoly

Čtení protokolu událostí pomocí položky vlastnosti třídy EventLog. Třída EventLog vlastnost položky je kolekce všech položek v protokolu událostí. Můžete iterovat této kolekce a číst všechny položky v určeném protokolu. Následující kód demonstruje postup:
      
//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();

Zapisovat protokoly

Zápis protokolu událostí, použijte metodu WriteEntry třídy EventLog. Zapsat do protokolu událostí úspěšně, musí mít aplikace přístup pro zápis do protokolu se pokouší zapisovat. Další informace o oprávnění, která musíte mít ke čtení a zápisu v protokolu událostí naleznete na následujícím webu.
Zabezpečení Ramification protokoly událostí
http://msdn2.microsoft.com/en-us/library/4xz6w79h(vs.71).aspx
Před zápisem položky do protokolu je nutné nastavit vlastnost zdroj na instanci komponenty EventLog. Při komponenty zapíše položku, systém automaticky ověří zobrazíte, pokud zadaný zdroj je registrována s protokolu událostí zápisu do součást a potom zavolá CreateEventSource (Pokud CreateEventSource musí být volána).
  
//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();   

Vymazat protokoly

Při zaplnění protokolu událostí, přestane zaznamenávat nové události informace nebo začíná přepsat starší položky. Pokud Zastaví zaznamenávání událostí, zrušte protokolu existující položky a povolit protokolu událostí nahrávání znovu spustit. Volání metody Vymazat na instanci komponenty protokolu událostí.

Poznámka: Chcete-li vymazat položky protokolu událostí, musíte mít oprávnění správce v počítači kde is. protokolu
     
//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(); 

Vytvořit a odstranit vlastní protokoly

Vytvořit vlastní protokol

Pomocí metody CreateEventSource lze vytvořit vlastní obslužné rutiny události vlastní. Před vytvořením protokolu událostí ověřte, zda zdroj používáte není již existovat a volání CreateEventSource pomocí metody SourceExists. Pokud se pokusíte vytvořit protokolu událostí, které již existuje System.ArgumentException vyvolána.
     
// 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"); 

Odstranit vlastní protokol

Odstranění protokolu událostí můžete Odstranit metoda třídy EventLog. Více než jednoho zdroje může zapisovat do protokolu událostí. Proto před odstranit vlastní protokolu ujistěte, že neexistují žádné zdroje, které zápisu do protokolu.
     
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.");
}    

Příjem událostí oznámení

Můžete přijímat oznámení události při položka je zapsána do určitého protokolu. To provedete implementovat obslužné rutiny události EntryWritten instance EventLog. EnableRaisingEvents také nastavit na hodnotu true.

Poznámka: Oznámení událostí můžete přijímat pouze při položky jsou zapsány v místním počítači. Nemůžete přijímat oznámení pro položky, které jsou zapsány ve vzdálených počítačích.

Úplný výpis kódu

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);
		}
	}
}

Ověřte výsledky

Ověřit výsledky, postupujte takto:
  1. V aplikaci Microsoft Visual Studio .NET nebo Microsoft Visual Studio 2005 vytvořte nové Visual C# .NET nebo Visual C# 2005 aplikace Windows projektu. Ve výchozím nastavení je vytvořen Form1.vb.
  2. Kód, který je uveden v tomto článku v části "Výpis dokončeno kód" nahradit kód v Form1.vb.
  3. V nabídce Debug klepněte na tlačítko Start spustit aplikaci.
  4. Ve formuláři provádět různé akce.
  5. V nabídce Zobrazit klepněte na tlačítko Server Explorer a ověřit tak výsledky.
  6. Rozbalte položku Servers a rozbalte Názvu počítače.
  7. Pod názvem počítače rozbalte protokoly událostí.

    Poznámka: Uzel servery Server Explorer není k dispozici v akademické vydání sady Visual C# .NET. V takových případech můžete použít Prohlížeč událostí zobrazit výsledky aplikace.
  8. Zkontrolujte Server Explorer ověřit správně provádět všechny úkoly.

Odkazy

Další informace naleznete na následujícím webu společnosti Microsoft:
Třída EventLog
http://msdn2.microsoft.com/en-us/library/system.diagnostics.eventlog(vs.71).aspx

Vlastnosti

ID článku: 815314 - Poslední aktualizace: 14. listopadu 2007 - Revize: 2.6
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
Klíčová slova: 
kbmt kbeventservice kbnetwork kbmanaged kbprogramming kbhowtomaster kbeventlog kbhowto KB815314 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:815314

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com