سؤال

هل يمكنك مساعدتي في حل مشكلة عدم توافق التالية بين بيثون 2.5 و 2.6؟

وlogger.conf:

[loggers]
keys=root,aLogger,bLogger

[handlers]
keys=consoleHandler

[formatters]
keys=

[logger_root]
level=NOTSET
handlers=consoleHandler

[logger_aLogger]
level=DEBUG
handlers=consoleHandler
propagate=0
qualname=a

[logger_bLogger]
level=INFO
handlers=consoleHandler
propagate=0
qualname=b

[handler_consoleHandler]
class=StreamHandler
args=(sys.stderr,)

وmodule_one.py:

import logging
import logging.config

logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a.submod')
b_log = logging.getLogger('b.submod')

def function_one():
    b_log.info("function_one() called.")

وmodule_two.py:

import logging
import logging.config

logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a.submod')
b_log = logging.getLogger('b.submod')

def function_two():
    a_log.info("function_two() called.")

وlogger.py:

from module_one import function_one
from module_two import function_two

function_one()
function_two()

والناتج من استدعاء logger.py تحت أوبونتو 9.04:

$ python2.5 logger.py
$

$ python2.6 logger.py
function_one() called.
function_two() called.
$
هل كانت مفيدة؟

المحلول

وهذا هو الخلل الذي كان قد حدد ما بين 2.5 و 2.6. الغرض وظيفة fileConfig () لتكوين لمرة واحدة وذلك لا ينبغي أن يسمى أكثر من مرة - ولكن اخترت لترتيب ذلك. سلوك المقصود من fileConfig هو تعطيل أي قطع الاشجار التي لم يرد ذكرها صراحة في التكوين، وترك مكن قطع الاشجار المذكورة وأطفالهن؛ علة كان يسبب للأطفال ليتم تعطيل عندما لا ينبغي أن يكون. يذكر التكوين سبيل المثال مسجل الحطابين "أ" و "ب". بعد استدعاء getLogger ( 'a.submod') يتم إنشاء مسجل الطفل. الدعوة fileConfig الثانية خطأ تعطيل هذا في بايثون 2.5 - 2.6 في بيثون لا يتم تعطيل المسجل كما هو طفل ومسجل المذكورة صراحة في تكوين

نصائح أخرى

وأنا لا أفهم أسباب هذا السلوك نفسي ولكن كما ذكرتم أيضا في 2.6 يعمل بشكل مختلف. يمكننا أن نفترض أن هذا الخلل يؤثر 2.5

وكحل مؤقت أقترح ما يلي:

وextra_module.py:

import logging
import logging.config

logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a.submod')
b_log = logging.getLogger('b.submod')

وmodule_one.py:

from extra_module import a_log

def function_one():
    a_log.info("function_one() called.")

وmodule_two.py:

from extra_module import b_log

def function_two():
    b_log.info("function_two() called.")

وباستخدام هذا المخطط وكنت قادرا على تشغيل logger.py على python2.5.4 مع نفس السلوك كما من 2.6

ومثيرة للاهتمام ... لعبت قليلا في وحدة تحكم ويبدو أن الدعوة الثانية لlogging.config.fileConfig والتلويث الامور. لا يدري لماذا هذا على الرغم من ... وفيما يلي نص يوضح المشكلة:

lorien$ python2.5
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> import logging.config
>>> logging.config.fileConfig('logger.conf')
>>> alog = logging.getLogger('a.submod')
>>> alog.info('foo')
foo
>>> import logging
>>> import logging.config
>>> alog.info('foo')
foo
>>> logging.config.fileConfig('logger.conf')
>>> alog.info('foo')
>>> alog = logging.getLogger('a.submod')
>>> alog.info('foo')
>>> 
>>> blog = logging.getLogger('b.submod')
>>> blog.info('foo')
foo
>>>

وبمجرد أن أدعو logging.config.fileConfig مرة الثانية، يتوقف المثال مسجل بلدي تسجيل. الاستيلاء على سبيل المثال تسجيل جديد لا يساعد لأنه نفس الكائن. إذا انتظرت حتى بعد تكوين المرتين لجلب الحالات مسجل، ثم عمل الأشياء - وهذا هو السبب يعمل المثال blog

.

واقتراحي هو تأخير الاستيلاء على الحالات مسجل حتى كنت في الوظائف. إذا قمت بنقل المكالمات إلى logging.getLogger() إلى function_one وfunction_two، ثم كل شيء يعمل بشكل جيد.

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

logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a')
b_log = logging.getLogger('b')

وأنا لست متأكدا من الخطأ بالضبط، ولكن وحدة V2.5 مسجل يبدو أن لها أسماء مشكلة مطابقة تمريرها إلى getLogger() مع الأسماء في ملف التكوين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top