문제

Python 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()

Ubuntu 9.04에서 Calling Logger.py의 출력 :

$ python2.5 logger.py
$

$ python2.6 logger.py
function_one() called.
function_two() called.
$
도움이 되었습니까?

해결책

이것은 2.5와 2.6 사이에 고정 된 버그입니다. fileconfig () 함수는 일회성 구성을위한 것이므로 두 번 이상 호출되어서는 안되지만이를 정리하도록 선택합니다. FileConfig의 의도 된 동작은 구성에 명시 적으로 언급되지 않은 로거를 비활성화하고 언급 된 로거와 그 자녀를 가능하게하는 것입니다. 버그로 인해 아이들은 그렇지 않아야 할 때 장애가 발생했습니다. 예제 로거 구성은 로거 'a'및 'b'를 언급합니다. GetLogger ( 'A.Submod') 호출 후 어린이 로거가 만들어집니다. 두 번째 FileConfig Call은 Python 2.5에서 이것을 잘못 비활성화합니다 - Python 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.")

이 체계를 사용하여 2.6과 동일한 동작으로 Python2.5.4에서 logger.py를 실행할 수있었습니다.

흥미로운 ... 나는 콘솔에서 약간 연주했는데 두 번째 전화처럼 보입니다. 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