Rug*_*rra 13 python import logging
考虑以下代码:
import logging
print "print"
logging.error("log")
Run Code Online (Sandbox Code Playgroud)
我明白了:
print
ERROR:root:log
Run Code Online (Sandbox Code Playgroud)
现在,如果我在前一个代码的开头包含一个thid-party模块并重新运行它,我只得到:
print
Run Code Online (Sandbox Code Playgroud)
有一些关于此的问题,但在这里我无法触及我正在导入的模块.
第三方模块的代码在这里: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[:]
Run Code Online (Sandbox Code Playgroud)
from dq2.clientapi.DQ2 import DQ2
import logging
logging.disable(logging.NOTSET)
Run Code Online (Sandbox Code Playgroud)
logs = logging.getLogger('root')
logs.error("Some error")
Run Code Online (Sandbox Code Playgroud)
下一个工作,但产生了一些额外的错误:
from dq2.clientapi.DQ2 import DQ2
import logging
reload(logging)
Run Code Online (Sandbox Code Playgroud)
我明白了:
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>
Run Code Online (Sandbox Code Playgroud)
from dq2.clientapi.DQ2 import DQ2
import logging
logger = logging.getLogger(__name__)
ch = logging.StreamHandler()
logger.addHandler(ch)
logger.error("log")
Run Code Online (Sandbox Code Playgroud)
Ale*_*mas 12
要从根记录器完全清除现有日志记录配置,这可能有效:
root = logging.getLogger()
map(root.removeHandler, root.handlers[:])
map(root.removeFilter, root.filters[:])
Run Code Online (Sandbox Code Playgroud)
但是,这不会重置为"默认",这会清除所有内容.你必须添加一个StreamHandler来实现你想要的.
Eug*_*mov 11
一个更完整的解决方案,不会使任何记录器失效。应该可以工作,除非某些模块做了一些奇怪的事情,例如保存对过滤器或处理程序的引用。
def reset_logging():
manager = logging.root.manager
manager.disabled = logging.NOTSET
for logger in manager.loggerDict.values():
if isinstance(logger, logging.Logger):
logger.setLevel(logging.NOTSET)
logger.propagate = True
logger.disabled = False
logger.filters.clear()
handlers = logger.handlers.copy()
for handler in handlers:
# Copied from `logging.shutdown`.
try:
handler.acquire()
handler.flush()
handler.close()
except (OSError, ValueError):
pass
finally:
handler.release()
logger.removeHandler(handler)
Run Code Online (Sandbox Code Playgroud)
不用说,您必须在运行后reset_logging()设置日志记录。
eca*_*mur 10
这取决于其他模块正在做什么; 例如,如果它正在呼叫,logging.disable那么你可以打电话logging.disable(logging.NOTSET)重置它.
您可以尝试重新加载logging模块:
logging.shutdown()
reload(logging)
Run Code Online (Sandbox Code Playgroud)
问题是这会使第三方模块的副本logging处于不可用状态,因此可能会导致更多问题.
| 归档时间: |
|
| 查看次数: |
10464 次 |
| 最近记录: |