python - पाइथन लॉगर्स को लॉग के अलावा सभी संदेशों को stdout पर आउटपुट करना




logging error-logging (4)

logging मॉड्यूल का उपयोग करके पाइथन लॉगिंग करने का कोई तरीका है स्वचालित रूप से लॉग फ़ाइल के अतिरिक्त stdout को चीजों को आउटपुट करने के लिए जहां उन्हें जाना है? उदाहरण के लिए, मुझे logger.warning करने के लिए सभी कॉल चाहिए। logger.warning , logger.critical , logger.error उनके इच्छित स्थानों पर जाने के लिए, लेकिन इसके अलावा हमेशा logger.error पर प्रतिलिपि बनाई जाएंगी। यह डुप्लिकेटिंग संदेशों से बचने के लिए है:

mylogger.critical("something failed")
print "something failed"

आप फ़ाइल और stdout के लिए दो हैंडलर बना सकते हैं और फिर basicConfig लिए handlers तर्क के साथ एक लॉगर बना basicConfig । यह उपयोगी हो सकता है यदि आपके पास समान हैंडलर के लिए एक ही log_level और प्रारूप आउटपुट है:

import logging
import sys

file_handler = logging.FileHandler(filename='tmp.log')
stdout_handler = logging.StreamHandler(sys.stdout)
handlers = [file_handler, stdout_handler]

logging.basicConfig(
    level=logging.DEBUG, 
    format='[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s',
    handlers=handlers
)

logger = logging.getLogger('LOGGER_NAME')

कई हैंडलर का उपयोग करना संभव है।

import logging
import auxiliary_module

# create logger with 'spam_application'
log = logging.getLogger('spam_application')
log.setLevel(logging.DEBUG)

# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(fh)

# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
ch.setFormatter(formatter)
log.addHandler(ch)

log.info('creating an instance of auxiliary_module.Auxiliary')
a = auxiliary_module.Auxiliary()
log.info('created an instance of auxiliary_module.Auxiliary')

log.info('calling auxiliary_module.Auxiliary.do_something')
a.do_something()
log.info('finished auxiliary_module.Auxiliary.do_something')

log.info('calling auxiliary_module.some_function()')
auxiliary_module.some_function()
log.info('done with auxiliary_module.some_function()')

# remember to close the handlers
for handler in log.handlers:
    handler.close()
    log.removeFilter(handler)

कृपया देखें: https://docs.python.org/2/howto/logging-cookbook.html


सबसे आसान तरीका:

import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

सभी लॉगिंग आउटपुट हैंडलर द्वारा संभाला जाता है; रूट logging.StreamHandler() बस एक logging.StreamHandler() जोड़ें।

स्ट्रीम स्ट्रीम हैंडलर को कॉन्फ़िगर करने का एक उदाहरण यहां दिया गया है (डिफ़ॉल्ट stderr बजाय stdout का उपयोग करके) और इसे रूट लॉगर में जोड़ना:

import logging
import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
root.addHandler(ch)




error-logging