2010-07-20 19 views
35

Tôi đang cố gắng tìm một cách hay để đọc tệp nhật ký trong thời gian thực bằng cách sử dụng python. Tôi muốn xử lý các dòng từ một tệp nhật ký tại một thời điểm khi nó được viết. Bằng cách nào đó tôi cần phải cố gắng để đọc các tập tin cho đến khi nó được tạo ra và sau đó tiếp tục xử lý dòng cho đến khi tôi chấm dứt quá trình. Có cách nào thích hợp để làm việc này không? Cảm ơn.Đọc từ tệp nhật ký vì nó đang được viết bằng python

+0

Điều này cũng tốt ... Tôi nghĩ rằng nó phù hợp với tiêu chí của bạn tốt và cung cấp một lớp học có thể được mở rộng dễ dàng. [http://code.activestate.com/recipes/577968-log-watcher-tail-f-log/](http://code.activestate.com/recipes/577968-log-watcher-tail-f-log /) – mogga

Trả lời

20

Bạn có thể thử với một cái gì đó như thế này:

import time 

while 1: 
    where = file.tell() 
    line = file.readline() 
    if not line: 
     time.sleep(1) 
     file.seek(where) 
    else: 
     print line, # already has newline 

Ví dụ được chiết xuất từ ​​here.

+0

Điều này có vẻ là làm việc nhưng nó sẽ không cho phép tôi tạo ra các đối tượng hoặc ghi vào cơ sở dữ liệu cùng một lúc trong ứng dụng django của tôi. Tôi không thấy lý do rõ ràng cho việc này; có sửa chữa đơn giản không? – Anon

+0

Tôi không biết. Bạn nên đăng một số mã trong một câu hỏi riêng để nhận câu trả lời cho câu hỏi này, tôi đoán vậy. Tôi không thấy bất kỳ lý do nào để không cập nhật cơ sở dữ liệu nếu bạn đặt mã đó bên trong cơ sở dữ liệu này ... –

+0

Hãy làm việc này nhưng tôi phải xáo trộn chuỗi trước khi tôi có thể viết nó vào cơ sở dữ liệu của mình. Cảm ơn. – Anon

-1

Có lẽ bạn có thể làm một cuộc gọi hệ thống để

tail -f 

sử dụng os.system()

32

Hãy xem this PDF bắt đầu từ trang 38, ~ trượt I-77 và bạn sẽ tìm thấy tất cả thông tin bạn cần. Tất nhiên phần còn lại của các slide là tuyệt vời, quá, nhưng những đối phó cụ thể với vấn đề của bạn:

import time 
def follow(thefile): 
    thefile.seek(0,2) # Go to the end of the file 
    while True: 
     line = thefile.readline() 
     if not line: 
      time.sleep(0.1) # Sleep briefly 
      continue 
     yield line 
+4

Đáng chú ý rằng điều này sẽ bỏ qua bất kỳ nội dung nào đã có trong tệp nhật ký, chỉ in các mục "mới" được tạo sau khi trình lặp này được tạo. Ngoài ra PDF thực sự là một mỏ vàng;) – blented

3

Vì đây là Python và ghi nhật ký được gắn thẻ, có một khả năng khác để thực hiện việc này.

Tôi giả định điều này dựa trên trình ghi nhật ký Python, ghi nhật ký.Handler.

Bạn chỉ có thể tạo ra một lớp mà được sự (tên) Ví dụ logger và ghi đè lên emit chức năng để đưa nó vào một giao diện (nếu bạn cần điều khiển chỉ cần thêm một handler console để xử lý tập tin)

Ví dụ:

import logging 

class log_viewer(logging.Handler): 
    """ Class to redistribute python logging data """ 

    # have a class member to store the existing logger 
    logger_instance = logging.getLogger("SomeNameOfYourExistingLogger") 

    def __init__(self, *args, **kwargs): 
     # Initialize the Handler 
     logging.Handler.__init__(self, *args) 

     # optional take format 
     # setFormatter function is derived from logging.Handler 
     for key, value in kwargs.items(): 
      if "{}".format(key) == "format": 
       self.setFormatter(value) 

     # make the logger send data to this class 
     self.logger_instance.addHandler(self) 

    def emit(self, record): 
     """ Overload of logging.Handler method """ 

     record = self.format(record) 

     # --------------------------------------- 
     # Now you can send it to a GUI or similar 
     # "Do work" starts here. 
     # --------------------------------------- 

     # just as an example what e.g. a console 
     # handler would do: 
     print(record) 

Tôi hiện đang sử dụng mã tương tự để thêm TkinterTreectrl.Multilistbox để xem đầu ra nhật ký khi chạy.

Off-Side: Trình ghi nhật ký chỉ nhận dữ liệu ngay sau khi được khởi tạo, vì vậy nếu bạn muốn có sẵn tất cả dữ liệu, bạn cần khởi chạy nó ngay từ đầu. (Tôi biết đây là những gì được mong đợi, nhưng tôi nghĩ rằng nó là giá trị được đề cập.)

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