2017-04-26 63 views
0

我正在学习有关Python记录,但我不明白为什么日志可以初始化像这样:为什么记录模块在没有实例的情况下被访问?

logging.basicConfig(level=logging.INFO) 

不就需要这样的东西:

l_instance = logging.basicConfig(level=logging.INFO) 

方式类似, CSV是这样做的:

c_instance = csv.reader() 
+1

[“Logger有以下属性和方法。注意,Logger不会直接实例化,但总是通过模块级函数'logging.getLogger(name) '“](https://docs.python.org/2/library/logging.html) –

+1

另外,请阅读[PEP](https://www.python.org/dev/peps/pep-0282/)为理由。 Tl; dr版本:方便。 –

回答

1

让我们来看看解决这个问题的源代码。它的作用是暗示添加处理程序,以根:

_acquireLock() 
try: 
    if len(root.handlers) == 0: 
     filename = kwargs.get("filename") 
     if filename: 
      mode = kwargs.get("filemode", 'a') 
      hdlr = FileHandler(filename, mode) 
     else: 
      stream = kwargs.get("stream") 
      hdlr = StreamHandler(stream) 
     fs = kwargs.get("format", BASIC_FORMAT) 
     dfs = kwargs.get("datefmt", None) 
     fmt = Formatter(fs, dfs) 
     hdlr.setFormatter(fmt) 
     root.addHandler(hdlr) 
     level = kwargs.get("level") 
     if level is not None: 
      root.setLevel(level) 
finally: 
    _releaseLock() 

所以一个原因是,该方法返回None:d

现在,看看,如果你调用getLogger方法:

if name: 
    return Logger.manager.getLogger(name) 
else: 
    return root 

你cann看到它返回这个创建的根。同样的道理也适用于其他方法debug

def debug(msg, *args, **kwargs): 
    """ 
    Log a message with severity 'DEBUG' on the root logger. 
    """ 
    if len(root.handlers) == 0: 
     basicConfig() 
    root.debug(msg, *args, **kwargs) 

看到了吗?它在root上运行。 Pyton是开源的,你可以使用它;)

相关问题