6

Python 2.5 と 2.6 の間の次の非互換性の問題を解決するのを手伝ってくれませんか?

ロガー.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.")

ロガー.py:

from module_one import function_one
from module_two import function_two

function_one()
function_two()

Ubuntu 9.04 で logger.py を呼び出した場合の出力:

$ python2.5 logger.py
$

$ python2.6 logger.py
function_one() called.
function_two() called.
$
4

4 に答える 4

1

私自身はこの動作の理由を理解していませんが、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.")

このスキームを使用することで、2.6 と同じ動作で python2.5.4 で logger.py を実行できました。

于 2009-06-19T15:46:30.813 に答える
0

興味深い...コンソールで少し遊んだところ、 への2番目の呼び出し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
>>>

2 回目に呼び出すとすぐにlogging.config.fileConfig、ロガー インスタンスはログ記録を停止します。同じオブジェクトであるため、新しいロギング インスタンスを取得しても役に立ちません。ロガーインスタンスを取得するために両方の時間を設定した後まで待つと、うまくいきます - これがblogインスタンスが機能する理由です。

私の提案は、関数に入るまでロガーインスタンスの取得を遅らせることです。への呼び出しを および に移動するlogging.getLogger()function_onefunction_twoすべてがうまく機能します。

于 2009-06-19T15:47:03.447 に答える
0

両方のファイルで、ロガーの名前を次のように変更することで、これを修正できました。

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

正確なエラーはわかりませんが、v2.5 logger モジュールでは、渡されgetLogger()た名前と構成ファイル内の名前を一致させるのに問題があるようです。

于 2009-06-19T17:23:15.097 に答える