2011-04-11 20 views
5

संपादित करें: मैंने अपने प्रश्न के गोमांस का जवाब देने का अंत किया ताकि मेरे पास एक लॉगिंग लॉगिंग मॉड्यूल हो। हालांकि, मेरे पास अभी भी एक संबंधित प्रश्न है। नीचे मेरा जवाब देखें।लॉगिंग हैंडलर: मैं कैसे सुनिश्चित कर सकता हूं कि मैं दो नहीं बना रहा हूं?

मैं जो कुछ भी कर रहा हूं उसकी अस्थायी निर्देशिका में हमेशा लॉग इन करके लॉगिंग को लागू करने का प्रयास कर रहा हूं। ऐसा करने के लिए मैंने निम्नलिखित फ़ंक्शन लिखा है।

L:testing M:easy_log T:2011-04-11 15:30:14,315 > INFO: NEW LOGGER STARTED 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: working? 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: yes, seems to be working 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working? 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working? 

आप देख सकते हैं, यह अब डबल outputting है:

import logging, tempfile, os, sys 

def getlog(logname, filename = 'python.log', directory = None): 
    '''returns a logger with logname that will print to filename and directoryname.''' 
    if directory == None: 
     fd, fname = tempfile.mkstemp() 
     directory = os.path.dirname(fname) 

    fullpath = directory + '/' + filename 

    mylog = logging.getLogger(logname) 
    hdlr = logging.FileHandler(fullpath) 

    formatter = logging.Formatter('L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s') 
    hdlr.setFormatter(formatter) 
    mylog.addHandler(hdlr) 
    mylog.setLevel(logging.INFO) 
    mylog.info('NEW LOGGER STARTED') 
    return mylog 

if __name__ == '__main__': 
    log = getlog('testing') 
    log.info('working?') 
    log.info('yes, seems to be working') 

    log2 = getlog('testing') 
    log2.info('still working?') 

यहाँ उत्पादन होता है। हालांकि, लॉगिंग मॉड्यूल बल्कि भ्रमित है, और मुझे यह पता लगाने का कोई तरीका नहीं पता कि कोई लॉग पहले ही चालू हो चुका है या यदि किसी लॉग ऑब्जेक्ट में पहले से हैंडलर है। कुछ मदद की सराहना की जाएगी।

संपादित करें: थोड़ा और विस्तार जोड़ने के लिए, मैं इसे कई मॉड्यूल में कॉल करने की योजना बना रहा हूं, अनिवार्य रूप से "logging.getLogger" कॉल को प्रतिस्थापित करने का प्रयास कर रहा हूं।

उत्तर

1

मैंने अपने स्वयं के प्रश्न का उत्तर दिया। यहां कोड

global IS_SETUP 
IS_SETUP = False 
def setuplogger(filename = 'python.log', directory = None, format = 'L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s'): 
    global IS_SETUP 
    if directory == None: 
     fd, fname = tempfile.mkstemp() 
     directory = os.path.dirname(fname) 

    logging.basicConfig(filename = directory + '/' + filename, format = format) 
    IS_SETUP = True 

def getlog(logname, level = logging.INFO): 
    '''returns a logger with logname that will print to filename and directoryname.''' 
    if IS_SETUP == False: 
     setuplogger() 

    mylog = logging.getLogger(logname) 

    mylog.setLevel(level) 
    mylog.info('NEW LOGGER STARTED') 
    return mylog 

यह डबल कॉन्फ़िगरेशन से बचाता है। इसके अलावा, स्पष्ट रूप से मूल कॉन्फ़िगरेशन तब भी काम करेगा जब इसे कई बार कहा जाता था।

यदि कोई जानता है कि लॉग ऑब्जेक्ट पर कौन से हैंडलर हैं, तो मैं अभी भी जानना चाहूंगा। यह बिल्कुल असंभव लगता है।

+0

एफडब्ल्यूआईडब्ल्यू आप स्थापित हैंडलरों की सूची के माध्यम से बस "mylog.handlers" तक पहुंच सकते हैं – amirpc

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