write visor source registro propiedad log eventos eventlog estableció escribir antes c# winforms datagrid datatable event-log

c# - visor - Limite EventLogs por fecha



no se estableció la propiedad source antes de escribir en el registro de eventos (1)

Estoy capturando eventlogs y luego mostrándolos en una cuadrícula de datos, sin embargo, para los registros grandes lleva una eternidad regresar, por lo que me gustaría limitar los registros en las últimas 24 horas, pero no estoy seguro de cómo hacerlo. Me gustaría limitar la recopilación antes de iterar a través de cada entrada, porque eso tomaría todo el tiempo posible de esa manera. ¡Cualquier ayuda sería totalmente apreciada!

namespace SysTools { public partial class LogViewer : Form { DataTable eventLog = new DataTable(); DataSet dataset1 = new DataSet(); private EventLog unhandledLogs; public LogViewer(EventLog logs) { unhandledLogs = logs; InitializeComponent(); } private void LogViewer_Load(object sender, EventArgs e) { String currentLog = unhandledLogs.Log; DataTable dataTable1 = new DataTable(); DataColumn column; column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "Level"; dataTable1.Columns.Add(column); column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "Category"; dataTable1.Columns.Add(column); column = new DataColumn(); column.DataType = System.Type.GetType("System.DateTime"); column.ColumnName = "DateTime"; dataTable1.Columns.Add(column); column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "Message"; dataTable1.Columns.Add(column); dataTable1.Rows.Clear(); DateTime systemtime = new DateTime(); Int32 count = unhandledLogs.Entries.Count; for (int currLogIndex = 0; currLogIndex <= unhandledLogs.Entries.Count; currLogIndex++) { DataRow drnew = dataTable1.NewRow(); try { EventLogEntry currLogEntrys = unhandledLogs.Entries[currLogIndex]; EventLogEntry currLogEntry = currLogEntrys; string entrytype = currLogEntrys.EntryType.ToString(); drnew["Level"] = entrytype; drnew["Category"] = currLogEntry.Source; drnew["DateTime"] = currLogEntry.TimeGenerated; drnew["Message"] = currLogEntry.Message; dataTable1.Rows.Add(drnew); } catch { } } dataGridView1.DataSource = dataTable1; dataTable1.DefaultView.Sort = ("DateTime asc"); } } }


Eche un vistazo a las clases EventLogQuery y EventLogReader . En mi ejemplo a continuación, estoy leyendo las últimas 24 horas del valor de los registros del registro de eventos de la aplicación, y ponerlos en una lista. Puede adaptarse fácilmente para adaptarse a su propio registro y necesidades.

Tenga en cuenta que estoy haciendo algo moderadamente hacky para obtener la fecha en el formato esperado (debe mejorar eso), pero vea cómo estoy creando una consulta y luego solo procesando los registros recuperados.

public void GetEvents() { string FormattedDateTime = string.Format("{0}-{1}-{2}T{3}:{4}:{5}.000000000Z", DateTime.Now.Year, DateTime.Now.Month.ToString("D2"), DateTime.Now.AddDays(-1).Day.ToString("D2"), DateTime.Now.Hour.ToString("D2"), DateTime.Now.Minute.ToString("D2"), DateTime.Now.Second.ToString("D2")); string LogSource = @"Application"; string Query = "*[System[TimeCreated[@SystemTime >= ''" + FormattedDateTime + "'']]]"; var QueryResult = new EventLogQuery(LogSource, PathType.LogName, Query); var Reader = new System.Diagnostics.Eventing.Reader.EventLogReader(QueryResult); List<EventRecord> Events = new List<EventRecord>(); bool Reading = true; while (Reading) { EventRecord Rec = Reader.ReadEvent(); if (Rec == null) Reading = false; Events.Add(Rec); // You could add to your own collection here instead of adding to a list } }