पर रीडायरेक्ट करने के लिए रीडायरेक्ट कर रहा है तो अभी हमारे पास बहुत सारी पायथन स्क्रिप्ट हैं और हम उन्हें मजबूत करने और फिक्स और अनावश्यकताओं को मजबूत करने की कोशिश कर रहे हैं। उन चीजों में से एक जो हम करने की कोशिश कर रहे हैं, यह सुनिश्चित करना है कि सभी sys.stdout/sys.stderr पायथन लॉगिंग मॉड्यूल में जाते हैं।sys.stdout को python लॉगिंग
अब मुख्य बात यह है कि हम चाहते हैं निम्नलिखित मुद्रित: अजगर त्रुटि संदेशों में से सभी में काफी
[<ERROR LEVEL>] | <TIME> | <WHERE> | <MSG>
अब सभी sys.stdout/sys.stderr msgs [स्तर के प्रारूप में हैं ] - एमएसजी, जो सभी sys.stdout/sys.stderr का उपयोग कर लिखे गए हैं। मैं ठीक से पार्स कर सकता हूं, मेरे sys.stdout wrapper में और sys.stderr wrapper में। फिर विश्लेषण किए गए इनपुट के आधार पर संबंधित लॉगिंग स्तर पर कॉल करें।
तो मूल रूप से हमारे पास foo नामक एक पैकेज है, और लॉग नामक एक उप-पैकेज है।
def initLogging(default_level = logging.INFO, stdout_wrapper = None, \
stderr_wrapper = None):
"""
Initialize the default logging sub system
"""
root_logger = logging.getLogger('')
strm_out = logging.StreamHandler(sys.__stdout__)
strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_TIME_FORMAT, \
DEFAULT_LOG_TIME_FORMAT))
root_logger.setLevel(default_level)
root_logger.addHandler(strm_out)
console_logger = logging.getLogger(LOGGER_CONSOLE)
strm_out = logging.StreamHandler(sys.__stdout__)
#strm_out.setFormatter(logging.Formatter(DEFAULT_LOG_MSG_FORMAT, \
# DEFAULT_LOG_TIME_FORMAT))
console_logger.setLevel(logging.INFO)
console_logger.addHandler(strm_out)
if stdout_wrapper:
sys.stdout = stdout_wrapper
if stderr_wrapper:
sys.stderr = stderr_wrapper
def cleanMsg(msg, is_stderr = False):
logy = logging.getLogger('MSG')
msg = msg.rstrip('\n').lstrip('\n')
p_level = r'^(\s+)?\[(?P<LEVEL>\w+)\](\s+)?(?P<MSG>.*)$'
m = re.match(p_level, msg)
if m:
msg = m.group('MSG')
if m.group('LEVEL') in ('WARNING'):
logy.warning(msg)
return
elif m.group('LEVEL') in ('ERROR'):
logy.error(msg)
return
if is_stderr:
logy.error(msg)
else:
logy.info(msg)
class StdOutWrapper:
"""
Call wrapper for stdout
"""
def write(self, s):
cleanMsg(s, False)
class StdErrWrapper:
"""
Call wrapper for stderr
"""
def write(self, s):
cleanMsg(s, True)
अब हम उदाहरण के लिए हमारे लिपियों में से एक में यह कहेंगे:
import foo.log
foo.log.initLogging(20, foo.log.StdOutWrapper(), foo.log.StdErrWrapper())
sys.stdout.write('[ERROR] Foobar blew')
कौन सा एक त्रुटि लॉग संदेश में परिवर्तित किया जाएगा __init__.py
हम निम्नलिखित परिभाषित करते हैं। जैसा:
[ERROR] | 20090610 083215 | __init__.py | Foobar Blew
अब समस्या यह है कि जब हम, मॉड्यूल जहां त्रुटि संदेश लॉग इन किया गया था अब __init__
है जो पूरा उद्देश्य धरा (foo.log.__init__.py
फ़ाइल के अनुरूप)।
मैंने stderr/stdout ऑब्जेक्ट्स की गहरी कॉपी/उथली कॉपी करने की कोशिश की, लेकिन यह कुछ भी नहीं करता है, यह अभी भी मॉड्यूल का संदेश __init__.py
में हुआ था। मैं इसे कैसे बना सकता हूं ताकि ऐसा न हो?