سؤال

في جانغو، لقد حصلت على قطع الاشجار في كل مكان، وحاليا مع أسماء الثابت تلوينها.

لتسجيل مستوى الوحدة النمطية (أي في وحدة نمطية من وظائف رأي) لدي الرغبة للقيام بذلك.

log = logging.getLogger(__name__)

لتسجيل على مستوى فئة (أي، في أسلوب فئة __init__) لدي الرغبة للقيام بذلك.

self.log = logging.getLogger("%s.%s" % (
    self.__module__, self.__class__.__name__))

وأنا أبحث عن الآراء الثانية قبل أن معالجة عشرات الحوادث من getLogger("hard.coded.name").

وسيكون هذا العمل؟ أي شخص آخر تسمية قطع الاشجار مع الطرق ضعيف الخيال نفسها؟

وعلاوة على ذلك، يجب أن يتكسر وإرسال الديكور فئة لهذا التعريف سجل؟

هل كانت مفيدة؟

المحلول

وأنا عادة لا تستخدم أو العثور على الحاجة لقطع الاشجار على مستوى الدرجة، ولكن أظل وحدات بلدي في فئات قليلة على الأكثر. بسيطة:

import logging
LOG = logging.getLogger(__name__)

في الجزء العلوي من وحدة واللاحقة:

LOG.info('Spam and eggs are tasty!')

ومن أي مكان في الملف يحصل عادة لي إلى حيث أريد أن أكون. هذا يتجنب الحاجة إلى self.log في كل مكان، والتي تميل إلى يزعجني سواء من منظور وضع، فإنه في وكل الطبقة ويجعلني 5 شخصيات أقرب إلى خطوط 79 الحرف الذي يصلح.

هل يمكن دائما استخدام الزائفة الطبقة الديكور:

>>> import logging
>>> class Foo(object):
...     def __init__(self):
...             self.log.info('Meh')
... 
>>> def logged_class(cls):
...     cls.log = logging.getLogger('{0}.{1}'.format(__name__, cls.__name__))
... 
>>> logged_class(Foo)
>>> logging.basicConfig(level=logging.DEBUG)
>>> f = Foo()
INFO:__main__.Foo:Meh

نصائح أخرى

لتسجيل مستوى الفئة، كبديل للالديكور من الدرجة الزائفة، هل يمكن استخدام metaclass لجعل مسجل لأنك في وقت إنشاء الفئة ...

import logging

class Foo(object):
    class __metaclass__(type):
        def __init__(cls, name, bases, attrs):
            type.__init__(name, bases, attrs)
            cls.log = logging.getLogger('%s.%s' % (attrs['__module__'], name))
    def __init__(self):
        self.log.info('here I am, a %s!' % type(self).__name__)

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    foo = Foo()

وهذا يبدو أنه سوف يعمل، إلا أن ذلك لم يكن لديك self سمة __module__. سوف فئتها. الدعوة المسجل على مستوى الطبقة يجب أن تبدو مثل:

self.log = logging.getLogger( "%s.%s" % ( self.__class__.__module__, self.__class__.__name__ ) )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top