/ / दो पाइलन्स लकड़हारा हैंडलर (संतरी / रेवेन और कंसोल) एक ही क्वालनेम के लिए - अजगर, लॉगिंग, तोरण, संतरी, रावेन

एक ही योग्य नाम के लिए दो पिलोन लॉगर हैंडलर (सेंट्री / रेवेन और कंसोल) - पायथन, लॉगिंग, पिलोन, सेंड्री, रेवेन

मैं एक Pylons / TurboGears एप्लिकेशन है। मैं उसी लकड़हारे को लॉग करना चाहूंगा (जैसा कि निर्दिष्ट किया गया है) qualname संपत्ति) दो अलग लॉग हैंडलर का उपयोग करने के लिए, प्रत्येक अपने लॉग स्तर के साथ।

संतरी / रेवेन लकड़हारे को केवल WARN + स्तर SQLAlchemy संदेश प्राप्त करना चाहिए, और कंसोल लकड़हारा INFO + स्तर SQLAlchemy संदेश प्राप्त करना चाहिए।

यहाँ मेरी संक्षिप्त आई फाइल है:

[loggers]
keys = root, sqlalchemy_console, sqlalchemy_sentry

[handlers]
keys = console, sentry

[formatters]
keys = generic

[logger_root]
level = INFO
handlers = console, sentry

[logger_sqlalchemy_console]
level = INFO
handlers = console
qualname = sqlalchemy.engine
propagate = 0

[logger_sqlalchemy_sentry]
level = WARN
handlers = sentry
qualname = sqlalchemy.engine
propagate = 0

हालांकि logger_sqlalchemy_sentry ओवरराइड करने लगता है logger_sqlalchemy_console और उसके संदेश चुरा लेते हैं। यह ini फ़ाइल में लकड़हारा के आदेश की परवाह किए बिना होता है।

क्या विभिन्न स्तरों के साथ कई स्थानों पर एक ही लकड़हारे / क्वालनेम को लॉग करने के लिए पाइलन्स का उपयोग करना संभव है?

यदि हां, तो क्या संतरी / रेवेन के लिए उन लकड़हाराओं में से एक होना संभव है? क्या मेरी इनआई फ़ाइल में कुछ गड़बड़ है, या रेवेन में कोई बग है?

उत्तर:

जवाब के लिए 2 № 1

समस्या यह है कि आप कर रहे हैं कि आप कॉन्फ़िगर कर रहे हैं sqlalchemy.engine Logger दो बार। लकड़हारा वर्गों के उदाहरणों के अनुरूप है logging.Logger, जो चीजें लौटा दी जाती हैं logging.getLogger(qualname)। उस कॉल के द्वारा केवल एक ही वस्तु को वापस किया जा सकता है, आप संभवतः एक ही गुण के साथ उनमें से एक से अधिक सेट कर सकते हैं।

आपको जो चाहिए वह कई है संचालकों उस लकड़हारे के लिए, उसी तरह जिस तरह आपने अपने रूट लकड़हारे को कई हैंडलर दिए थे। फिर आप व्यक्तिगत हैंडलर पर वांछित लॉग स्तर निर्दिष्ट कर सकते हैं।

दुर्भाग्य से, fileConfig() doesn "t आप कॉन्फ़िगर करने के लिए एक आसान तरीका देएक ही हैंडलर विभिन्न लॉग स्तरों के साथ, जो कि रिकॉर्ड बनाने के आधार पर होता है, आपको "रूट और दोनों के लिए डुप्लिकेट हैंडलर सेक्शन सेट करने की आवश्यकता होगी" sqlalchemy.engine लकड़हारा उनके लिए अलग लॉग स्तर है।


उत्तर № 2 के लिए 1

आप लकड़हारा और हैंडलर मिला रहे हैं - जैसा कि TokenMacGuy कहते हैं, आपको दो की जरूरत है संचालकों नाम के लकड़हारे के लिए sqlalchemy.engine। कॉन्फ़िगर करें StreamHandler (कंसोल) स्तर के साथ INFO और ए SentryHandler (संतरी) स्तर के साथ WARNING, और यह sqlalchemy.engine के स्तर के साथ लकड़हारा DEBUG या INFO। फिर आपको वांछित परिणाम प्राप्त करना चाहिए। (यहां तक ​​कि जब DEBUG संदेशों को लॉग किया जाता है, हैंडलर पर स्तर उन्हें उन घटनाओं को छोड़ने से रोक देगा जो उनके स्तर से कम हैं।)

जब तक आप पाइथन 2.6 या उससे पहले तक सीमित नहीं हैं, तब तक यह प्रयोग करने पर विचार करने लायक है logging.config.dictConfig प्राथमिकता में एपीआई logging.config.fileConfig, यदि आप। dictConfig एपीआई पुराने की तुलना में लॉगिंग कॉन्फ़िगरेशन पर बेहतर नियंत्रण की अनुमति देता है fileConfig एपीआई, जिसे और विकसित नहीं किया जाएगा।