24

このコードを考えてみましょう:

import logging
print "print"
logging.error("log")

私は得る:

print
ERROR:root:log

前のコードの先頭にサードパーティモジュールを含めて再実行すると、次のようになります。

print

これについては以前にいくつか質問がありますが、ここではインポートしているモジュールに触れることができません。

サードパーティモジュールのコードは次のとおりです: http: //atlas-sw.cern.ch/cgi-bin/viewcvs-atlas.cgi/offline/DataManagement/DQ2/dq2.clientapi/lib/dq2/clientapi/DQ2 .py?view = markupですが、私の質問はもっと一般的です。インポートするモジュールとは関係なくlogging、期待どおりにクリーンに動作する必要があります。

いくつかの(機能しない)提案された解決策:

from dq2.clientapi.DQ2 import DQ2
import logging
del logging.root.handlers[:]

from dq2.clientapi.DQ2 import DQ2
import logging
logging.disable(logging.NOTSET)

logs = logging.getLogger('root')
logs.error("Some error")

次のものは機能しますが、いくつかの追加エラーが発生しました。

from dq2.clientapi.DQ2 import DQ2
import logging
reload(logging)

私は得る:

print
ERROR:root:log
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-    opt/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 1509, in shutdown
    h.close()
  File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 705, in close
    del _handlers[self]
KeyError: <logging.StreamHandler instance at 0x2aea031f7248>
Error in sys.exitfunc:
Traceback (most recent call last):
  File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 1509, in shutdown
    h.close()
  File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 705, in close
    del _handlers[self]
KeyError: <logging.StreamHandler instance at 0x2aea031f7248>

from dq2.clientapi.DQ2 import DQ2
import logging
logger = logging.getLogger(__name__)
ch = logging.StreamHandler()  
logger.addHandler(ch)
logger.error("log")
4

3 に答える 3

26

他のモジュールが何をしているかによって異なります。たとえば、呼び出しているlogging.disable場合は、呼び出しlogging.disable(logging.NOTSET)てリセットできます。

loggingモジュールをリロードしてみてください:

from importlib import reload
logging.shutdown()
reload(logging)

問題は、これによりサードパーティ製モジュールが独自のコピーをlogging使用できない状態のままになるため、後でさらに問題が発生する可能性があることです。

于 2012-08-20T08:57:42.523 に答える