विभिन्न सेटिंग्स के साथ दो फ़ाइलों में प्रवेश करना


84

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

  • दो फाइलें: पहला समान रहता है।
  • दूसरी फ़ाइल में कुछ कस्टम प्रारूप होना चाहिए।

मैं मॉड्यूल के लिए डॉक्स पढ़ रहा हूं, बू वे इस समय मेरे लिए बहुत जटिल हैं। लकड़हारा, हैंडलर ...

तो, संक्षेप में:

पायथन 3 में दो फ़ाइलों को कैसे लॉग करें, अर्थात:

import logging
# ...
logging.file1.info('Write this to file 1')
logging.file2.info('Write this to file 2')

जवाबों:


155

आप ऐसा कुछ कर सकते हैं:

import logging
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')


def setup_logger(name, log_file, level=logging.INFO):
    """To setup as many loggers as you want"""

    handler = logging.FileHandler(log_file)        
    handler.setFormatter(formatter)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)

    return logger

# first file logger
logger = setup_logger('first_logger', 'first_logfile.log')
logger.info('This is just info message')

# second file logger
super_logger = setup_logger('second_logger', 'second_logfile.log')
super_logger.error('This is an error message')

def another_method():
   # using logger defined above also works here
   logger.info('Inside method')

1
डिफ़ॉल्ट लॉग स्तर है logging.WARNING, इसलिए यह अधिक स्पष्ट होगा यदि Logger.setLevel(logging.WARNING)इसे कहा जाता है।
zeekvfu 3

1
मेरा logger_1लॉग फ़ाइल में आउटपुट क्यों नहीं है? मैंने सेट कर दिया है logger_1.error('error foo'), लेकिन अभी भी काम नहीं कर रहा है
Gank

@ ज़ीकवफू की टिप्पणी और @ गैंक से प्रश्न का संयोजन ... यदि आप logger_1.info('message_1')लाइन को देखना चाहते हैं simplefile_1.log, तो आपको इसके बजाय स्तर का INFOउपयोग करने logger_1.setLevel(logging.INFO), या उपयोग logger_1.error('message_1')करने की आवश्यकता है। INFOस्तर होने पर एक संदेश स्पष्ट रूप से लॉग इन नहीं होगा WARNING, जो कि डिफ़ॉल्ट है।
dnlbrky

उत्तर संपादित किया। Logger_1.info को logger_1.warning पर सेट करें। इस तरह, स्तर सेट नहीं होना चाहिए।
user1812076

1
@ eos87 logger_1 और logger_2 वैश्विक हैं? यानी, मैं उन्हें किसी भी फ़ंक्शन के अंदर उपयोग कर सकता हूं? यदि नहीं, तो क्या यह मुख्य समारोह में उन्हें वैश्विक बनाने के लिए एक अच्छा विचार है? यदि हां, तो आप इसके बारे में कैसे जाएंगे?
दनाईल

19
def setup_logger(logger_name, log_file, level=logging.INFO):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(message)s')
    fileHandler = logging.FileHandler(log_file, mode='w')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)    


setup_logger('log1', txtName+"txt")
setup_logger('log2', txtName+"small.txt")
logger_1 = logging.getLogger('log1')
logger_2 = logging.getLogger('log2')




logger_1.info('111messasage 1')
logger_2.info('222ersaror foo')

1
क्या logger_1 और logger_2 वैश्विक हैं? यानी, मैं उन्हें किसी भी फ़ंक्शन के अंदर उपयोग कर सकता हूं? यदि नहीं, तो क्या यह मुख्य समारोह में उन्हें वैश्विक बनाने के लिए एक अच्छा विचार है? यदि हां, तो आप इसके बारे में कैसे जाएंगे?
दनाईल

आप ऐसा नहीं करेंगे, तो आप ऐसा करेंगे, जहां भी आप अपने लकड़हारे को परिभाषित करेंगे।
एलेक्स आर

1
क्या यह डुप्लिकेट कंसोल आउटपुट का कारण नहीं होगा?
एरोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.