2010-06-08 25 views
12

Tôi đã sử dụng System.Diagnostics.EventLog để xem nhật ký trên máy tính cục bộ. Tuy nhiên, tôi muốn mở một kho lưu trữ bản ghi sự kiện đã lưu (.evt hoặc .evtx) và xem các nhật ký được chứa trong tệp đã lưu. Tôi chỉ cần xem dấu thời gian, thư, nguồn, v.v. được liên kết với nhật ký trong tệp. Điều này có thể được thực hiện trong C#?Làm thế nào để mở lưu trữ bản ghi sự kiện đã lưu trong .NET?

Trả lời

2

Hãy thử LogParser công cụ từ Microsoft. Nó có thể tìm nạp bất kỳ dữ liệu nào từ nhật ký của bất kỳ định dạng nhật ký nào bằng cách sử dụng ngôn ngữ chọn giống SQL. Nó cũng có thể được sử dụng từ bất kỳ ứng dụng .NET nào. Ví dụ phân tích của các bản ghi CSV (Tôi tin rằng bạn có thể sử dụng mã này cho các tập tin EVT với những thay đổi nhỏ):

 public IList<LogRow> GetLog() 
     { 
      return Load("SELECT *, OUT_ROW_NUMBER() FROM logfile*.log WHERE Field2='Performance' ORDER BY Field1 ASC"); 
     } 

    private static IList<LogRow> Load(string sql) 
    { 
     IEnumerable<string[]> log = ParseLog(sql); 

     return Convert(log); 
    } 

    private static IList<LogRow> Convert(IEnumerable<string[]> log) 
    { 
     return log.Select(logRecord => new LogRow 
              { 
               TimeStamp = logRecord[2], 
               Category = logRecord[3], 
               Machine = logRecord[4], 
               ThreadId = logRecord[5], 
               ProcessId = logRecord[6], 
               ProcessName = logRecord[7], 
               DomainName = logRecord[8], 
               Message = logRecord[9], 
               Number = logRecord[10] 
              }).ToList(); 
    } 


     private static IEnumerable<string[]> ParseLog(string query) 
     { 
      var records = new LogQueryClassClass().Execute(
       query, 
       new COMCSVInputContextClass { headerRow = false, iTsFormat = "yyyy-MM-dd HH:mm:ss.fff" }); 
      var entries = new List<string[]>(); 

      while (!records.atEnd()) 
      { 
       entries.Add(records.getRecord().toNativeString("CSVseparator").Split(
           new[] { "CSVseparator" }, 
           StringSplitOptions.None)); 
       records.moveNext(); 
      } 

      records.close(); 
      return entries; 
     } 
0

Nếu mục đích của bạn là để đọc các bản ghi lưu lại, chúng ta có thể làm điều đó bằng EventLogReader. Về cơ bản nó lấy hai tham số - tên tệp (như trong đường dẫn tệp) và tham số thứ hai chỉ định loại đường dẫn. Để bạn tham khảo, nói rằng bạn có một tập tin .evtx lưu - temp.evtx, bạn có thể đọc nó như trong:

new EventLogReader(filepath, PathType.Filepath); 

này cung cấp cho bạn một trình đọc ghi sự kiện, có thể được sử dụng để đọc các sự kiện. Và hơn thế nữa, nếu bạn muốn đọc nội dung của nó, chúng ta có thể sử dụng Properties mà về cơ bản là một danh sách chuỗi. Có thể đọc nó, phân tích nó và nhận bất kỳ thông tin nào bạn cần.

Tôi đồng ý rằng chúng tôi không có quy định để trực tiếp nhận tất cả các chi tiết giống như những gì chúng tôi nhận được khi sử dụng EventLogEntry. Không bao giờ ít hơn, chúng tôi chỉ cần thực hiện một số phân tích cú pháp để có được những gì chúng tôi cần bằng cách sử dụng bản ghi sự kiện.

Các vấn đề liên quan