2010-07-20 9 views
35

का उपयोग करके लिखा जा रहा है, मैं पाइथन का उपयोग करके वास्तविक समय में लॉग फ़ाइल पढ़ने का एक अच्छा तरीका ढूंढने का प्रयास कर रहा हूं। मैं एक लॉग फ़ाइल से लाइनों को एक बार लिखने के लिए प्रक्रिया करना चाहता हूं। किसी भी तरह से मुझे फ़ाइल को तब तक पढ़ने की कोशिश करना जारी रखना चाहिए जब तक कि इसे बनाया नहीं जाता है और फिर प्रक्रिया को समाप्त होने तक लाइनों को संसाधित करना जारी रखें। क्या ऐसा करने का कोई उचित तरीका है? धन्यवाद।एक लॉग फ़ाइल से पढ़ें क्योंकि इसे पाइथन

+0

यह भी अच्छा है ... मुझे लगता है कि यह आपके मानदंडों को अच्छी तरह से फिट करता है और एक कक्षा प्रदान करता है जिसे आसानी से बढ़ाया जा सकता है। [http://code.activestate.com/recipes/577968-log-watcher-tail-f-log/](http://code.activestate.com/recipes/577968-log-watcher-tail-f-log /) – mogga

उत्तर

20

आप कुछ इस तरह के साथ की कोशिश कर सकते:

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 

उदाहरण here से निकाला गया था।

+0

ऐसा लगता है कि यह काम कर रहा है लेकिन यह मुझे मेरे django ऐप में एक ही समय में वस्तुओं को बनाने या डेटाबेस में लिखने की अनुमति नहीं देगा। मुझे इसके लिए एक स्पष्ट कारण नहीं दिख रहा है; क्या कोई साधारण फिक्स है? – Anon

+0

मुझे नहीं पता। मुझे लगता है कि इस के जवाब पाने के लिए आपको एक अलग प्रश्न में कुछ कोड पोस्ट करना चाहिए। मुझे डेटाबेस अपडेट नहीं होने का कोई कारण नहीं दिखता है यदि आप उस कोड को इस के अंदर रखते हैं ... –

+0

इसे काम करने के लिए मिला लेकिन मुझे अपने डेटाबेस में लिखने से पहले स्ट्रिंग के साथ बहुत गड़बड़ करनी पड़ी। धन्यवाद। – Anon

-1

हो सकता है कि आप एक सिस्टम कॉल

tail -f 

को os.system() का उपयोग कर

32

पेज 38 पर शुरू this PDF पर एक नजर डालें स्लाइड I-77 कर सकता है, ~ और आप सभी मिल जाएगा आपको जो जानकारी चाहिए बेशक स्लाइड के बाकी अद्भुत, बहुत हैं, लेकिन उन विशेष रूप से अपने मुद्दे से निपटने:

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

यह ध्यान देने योग्य है कि यह लॉग फ़ाइल में पहले से मौजूद किसी भी सामग्री को छोड़ देगा, केवल इस इटरेटर के निर्माण के बाद बनाई गई "नई" प्रविष्टियों को प्रिंट करेगा। इसके अलावा पीडीएफ वास्तव में एक सोने की खान है;) – blented

3

चूंकि यह पायथन और टैगिंग लॉगिंग है, ऐसा करने की एक और संभावना है।

मुझे लगता है कि यह एक पायथन लॉगर पर आधारित है, लॉगिंग। हैंडलर आधारित।

तुम सिर्फ एक वर्ग है कि (नाम) लकड़हारा उदाहरण हो जाता है बना सकते हैं और emit समारोह के ऊपर लिख एक जीयूआई पर इसे डाल करने के लिए कर सकते हैं उदाहरण

(यदि आप कंसोल की जरूरत है सिर्फ फ़ाइल हैंडलर के लिए एक सांत्वना हैंडलर जोड़ने):

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) 

मैं वर्तमान में इसी तरह के कोड का उपयोग कर रहा कार्यावधि में लॉगर आउटपुट देखने के लिए एक TkinterTreectrl.Multilistbox जोड़ने के लिए।

ऑफ़-साइड: लॉगर केवल आरंभ होने पर ही डेटा प्राप्त करता है, इसलिए यदि आप अपना पूरा डेटा उपलब्ध करना चाहते हैं, तो आपको इसे बहुत शुरुआत में प्रारंभ करना होगा। (मुझे पता है कि यह अपेक्षित है, लेकिन मुझे लगता है कि यह उल्लेखनीय है।)

संबंधित मुद्दे