2012-06-27 26 views
7

Tôi đang làm việc trên một chương trình và cần biết cách tôi sẽ đọc một mục cụ thể vào Nhật ký Sự kiện Windows dựa trên số Bản ghi, tập lệnh này sẽ có. Dưới đây là mã tôi đã làm việc với, nhưng tôi không muốn lặp qua tất cả các sự kiện cho đến khi tôi tìm thấy một trong những tôi đang tìm kiếm. Bất kỳ ý tưởng?Đọc Sự kiện Nhật ký Sự kiện Windows Cụ thể

import win32evtlog 

server = 'localhost' # name of the target computer to get event logs 
logtype = 'System' 
hand = win32evtlog.OpenEventLog(server,logtype) 
flags = win32evtlog.EVENTLOG_BACKWARDS_READ|win32evtlog.EVENTLOG_SEQUENTIAL_READ 
total = win32evtlog.GetNumberOfEventLogRecords(hand) 

while True: 
    events = win32evtlog.ReadEventLog(hand, flags,0) 
    if events: 
     for event in events: 
      if event.EventID == "27035": 
       print 'Event Category:', event.EventCategory 
       print 'Time Generated:', event.TimeGenerated 
       print 'Source Name:', event.SourceName 
       print 'Event ID:', event.EventID 
       print 'Event Type:', event.EventType 
       data = event.StringInserts 
       if data: 
        print 'Event Data:' 
        for msg in data: 
         print msg 
       break 
+0

Hãy nhớ gọi 'win32evtlog.CloseEventLog (tay) 'khi bạn hoàn tất. – twasbrillig

Trả lời

3

Không! Không có sẵn chức năng nào cho phép bạn có được sự kiện dựa trên id sự kiện.

tham khảo: Event logging functions

GetNumberOfEventLogRecords Retrieves the number of records in the specified event log. 
GetOldestEventLogRecord  Retrieves the absolute record number of the oldest record 
          in the specified event log. 
NotifyChangeEventLog  Enables an application to receive notification when an event 
          is written to the specified event log. 

ReadEventLog    Reads a whole number of entries from the specified event log. 
RegisterEventSource   Retrieves a registered handle to the specified event log. 

Chỉ phương pháp đáng quan tâm khác là đọc sự kiện lâu đời nhất.

Bạn sẽ phải lặp qua các kết quả bất kỳ cách nào và cách tiếp cận của bạn là đúng :)

Bạn chỉ có thể thay đổi hình thức của phương pháp của bạn như dưới đây nhưng điều này là không cần thiết.

events = win32evtlog.ReadEventLog(hand, flags,0) 
events_list = [event for event in events if event.EventID == "27035"] 
if event_list: 
    print 'Event Category:', events_list[0].EventCategory 

Đây chỉ là cách giống như bạn đang làm nhưng gọn gàng hơn

+0

Tuyệt vời! Tôi đã tìm thấy thông tin đó cách đây không lâu! Cảm ơn câu trả lời, tôi sẽ chấp nhận nó khi tôi có thể. –

+0

Tôi không biết trạng thái là gì tại thời điểm câu trả lời này được đăng, nhưng điều này không còn đúng nữa (xem câu trả lời của tôi bên dưới - nếu bạn có thể viết truy vấn WMI, bạn có thể truy vấn nó). –

+0

EventID là một số nguyên. Nó sẽ không bao giờ khớp với chuỗi "27035" – wojtow

6

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi đi qua nó, và nếu tôi đã làm, những người khác cũng có thể mắc.

Bạn cũng có thể viết truy vấn tùy chỉnh, cho phép bạn truy vấn bằng bất kỳ thông số WMI nào mà bạn có thể viết (bao gồm cả ID sự kiện). Nó cũng có lợi ích cho phép bạn kéo ra và loại bỏ tất cả các truy vấn VBS WMI đang tồn tại ở đó. Tôi thực sự sử dụng chức năng này thường xuyên hơn bất kỳ chức năng nào khác. Đối với ví dụ, xem:

Dưới đây là một ví dụ để truy vấn cho một sự kiện cụ thể trong Nhật ký ứng dụng. Tôi đã không thịt nó ra, nhưng bạn cũng có thể xây dựng một chuỗi thời gian WMI và truy vấn cho các sự kiện giữa hoặc kể từ ngày cụ thể/lần là tốt.

#! py -3 

import wmi 

def main(): 
    rval = 0 # Default: Check passes. 

    # Initialize WMI objects and query. 
    wmi_o = wmi.WMI('.') 
    wql = ("SELECT * FROM Win32_NTLogEvent WHERE Logfile=" 
      "'Application' AND EventCode='3036'") 

    # Query WMI object. 
    wql_r = wmi_o.query(wql) 

    if len(wql_r): 
     rval = -1 # Check fails. 

    return rval 



if __name__ == '__main__': 
    main() 
+0

Cân nhắc thêm mã thực tế vào câu trả lời của bạn và chỉ trì hoãn liên kết dưới dạng tham chiếu. Bạn muốn làm cho câu trả lời tự chứa như bạn không biết khi nào các liên kết đó sẽ hết hạn. – rayryeng

+0

Cảm ơn đề xuất - Tôi đã tiếp tục và thực hiện điều đó. –

0

Hiện có thư viện python sẽ thực hiện những gì bạn đang yêu cầu gọi là winevt. Những gì bạn đang tìm kiếm có thể được thực hiện thông qua các mục sau:

from winevt import EventLog 
query = EventLog.Query("System","Event/System[EventID=27035]") 
event = next(query)