2013-11-04 9 views
7

मैं हर एक अनुरोध के बारे में कुछ जानकारी लॉग इन करने के स्वरूपित रूप में एक व्यस्त http सर्वर से भेजने के लिए, उपयोग लॉग मॉड्यूल कुछ बात मैं नहीं करना चाहती पैदा करेगा हैं:सीएसवी फ़ाइल में लॉगिंग करने का सही तरीका क्या है?

[I 131104 15:31:29 Sys:34] 

मैं सीएसवी प्रारूप के बारे में सोच लेकिन मैं इसे अनुकूलित करने के लिए कैसे पता नहीं है, और अजगर सीएसवी मॉड्यूल है, लेकिन मैनुअल

import csv 
with open('some.csv', 'w', newline='') as f: 
    writer = csv.writer(f) 
    writer.writerows(someiterable) 

पढ़ा क्योंकि यह खोलने के लिए और एक फ़ाइल हर बार बंद होता है, मैं इस तरह से पूरे सर्वर धीमा होगा में डर लग रहा है प्रदर्शन, मैं क्या कर सकता था?

+1

आपको लॉगिंग का उपयोग करना चाहिए। प्रारूप प्रारूप उदाहरण के साथ सीएसवी लाइनों को आउटपुट करता है। –

उत्तर

6

बस पाइथन के logging मॉड्यूल का उपयोग करें।

आप जिस तरह से चाहते हैं आउटपुट समायोजित कर सकते हैं; Changing the format of displayed messages पर एक नज़र डालें:

import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
:

प्रारूप है जो संदेशों को प्रदर्शित किया जाता है बदलने के लिए आपको प्रारूप का उपयोग करना चाहते निर्दिष्ट करने की आवश्यकता logging.warning('And this, too')

और Formatters:

फ़ॉर्मेटर वस्तुओं अंतिम आदेश, संरचना, और लॉग संदेश की सामग्री को कॉन्फ़िगर करें।

आप आसानी से एक सीएसवी की तरह आउटपुट फ़ाइल बनाने के लिए एक , साथ : बदल सकते हैं।

आपको यहां अटैचिटस की एक सूची मिल जाएगी जिसका आप यहां उपयोग कर सकते हैं: LogRecord attributes

0

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

मैं दोहराता हूं - यह सबसे अच्छा विचार नहीं है, यह मेरी पहली बात है जो मेरे दिमाग में आई है। आप फ्लास्क या कुछ अन्य वेबैप ढांचे से लॉगिंग कार्यान्वयन से परामर्श करना चाह सकते हैं (AFAIR फ्लास्क में सीएसवी लॉगिंग भी है)।

1

जैसा कि स्लॉथ सुझाव देता है, आप आसानी से लॉग के डिलीमीटर को अल्पविराम में संपादित कर सकते हैं, इस प्रकार एक CSV फ़ाइल का उत्पादन कर सकते हैं।

कार्य उदाहरण:

import logging 

# create logger 
lgr = logging.getLogger('logger name') 
lgr.setLevel(logging.DEBUG) # log all escalated at and above DEBUG 
# add a file handler 
fh = logging.FileHandler('path_of_your_log.csv') 
fh.setLevel(logging.DEBUG) # ensure all messages are logged to file 

# create a formatter and set the formatter for the handler. 
frmt = logging.Formatter('%(asctime)s,%(name)s,%(levelname)s,%(message)s') 
fh.setFormatter(frmt) 

# add the Handler to the logger 
lgr.addHandler(fh) 

# You can now start issuing logging statements in your code 
lgr.debug('a debug message') 
lgr.info('an info message') 
lgr.warn('A Checkout this warning.') 
lgr.error('An error writen here.') 
lgr.critical('Something very critical happened.') 
+2

एक सीएसवी हैडर पंक्ति जोड़ने का कोई तरीका है? (यानी सीएसवी टेक्स्ट फ़ाइल में पहली पंक्ति जो स्तंभों के नाम रखती है?) – ycomp

+0

ऐ, यह वही हो सकता है जो आप खोज रहे हैं: http://stackoverflow.com/questions/27840094/write-a-header-at -Every-लॉगफ़ाइल-कि-है-निर्मित-साथ एक समय-चक्रित-लकड़हारा – ecoe

2

मैं सहमत होगा कि आप प्रवेश मॉड्यूल का उपयोग करना चाहिए, लेकिन क्या तुम सच में, बस एक प्रारूप स्ट्रिंग के साथ ठीक से यह नहीं कर सकते जैसे अन्य कुछ उत्तर दिखाने के रूप में वे करते हैं उस स्थिति को संबोधित न करें जहां आप एक संदेश को लॉग करते हैं जिसमें अल्पविराम होता है।

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

logger = logging.getLogger() 

formatter = MyCsvFormatter() 

handler = logging.FileHandler(filename, "w") 
handler.setFormatter(formatter) 
logger.addHandler(handler) 
logger.setLevel(level) 

आप स्पष्ट रूप से MyCsvFormatter वर्ग है, जो logging.Formatter से विरासत और प्रारूप() विधि

class MyCsvFormatter(logging.Formatter): 
    def __init__(self): 
     fmt = "%(levelname)s,%(message)s" # Set a format that uses commas, like the other answers 
     super(MyCsvFormatter, self).__init__(fmt=fmt) 

    def format(self, record): 
     msg = record.getMessage() 
     # convert msg to a csv compatible string using your method of choice 
     record.msg = msg 
     return super(MyCsvFormatter, self).format(self, record) 

नोट ओवरराइड करना चाहिए लागू करने के लिए होगा: मैं इससे पहले कि कुछ इस तरह किया है, लेकिन इस विशेष कोड नमूना

परीक्षण नहीं किया

जहाँ तक संदेश के वास्तविक एस्केपिंग कर के रूप में, यहाँ एक संभव तरीका है: Python - write data into csv format as string (not file)

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