2015-10-19 59 views
1

我有一个python代码(下面),它发出了下面的错误,我不明白问题出在哪里。据我所知,从这个python HOWTO记录器应该可用于定义记录器的main()调用的例程。我使用python 2.7.10。记录器不被本地函数识别

#!/usr/bin/python 

import logging 
import sys 

def setup(): 
    logger.debug('some text') 
    return 0 

def main(): 
    logger = logging.getLogger('some_logger_name') 
    logger.setLevel(logging.DEBUG) 
    consoleHandler = logging.StreamHandler() 
    consoleHandler.setLevel(logging.DEBUG) 
    consoleHandler.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) 
    logger.addHandler(consoleHandler) 

    ret = setup() 

if __name__=='__main__': 
    sys.exit(main()) # Exit python upon execution of main(). 

以下是错误消息我收到运行$python test.py

Traceback (most recent call last): 
    File "test.py", line 20, in <module> 
    sys.exit(main()) # Exit python upon execution of main(). 
    File "test.py", line 17, in main 
    ret = setup() 
    File "test.py", line 7, in setup 
    logger.debug('some text') 
NameError: global name 'logger' is not defined 

是否有任何人看到我的错误?

编辑: 感谢迄今为止的回复!你能否解释一下我的版本和上面提到的python HOWTO之间的区别(我附上了下面的相关摘录)。

如果你的程序是由多个模块组成,这里有一个如何你可以在它举办的日志记录的例子:

# myapp.py
import logging
import mylib

def main():
__logging.basicConfig(filename='myapp.log', level=logging.INFO)
__logging.info('Started')
__mylib.do_something()
__logging.info('Finished')

if __name__ == '__main__':
__main()

这里的模块mylib.py

# mylib.py
import logging

def do_something():
__logging.info('Doing something')

如果运行myapp.py,你应该在myapp.log看到:

INFO:root:Started
INFO:root:Doing something
INFO:root:Finished

这是希望你期望看到的。您可以使用mylib.py中的模式将其推广到多个模块。

Arg,对于奇怪的编辑抱歉。我没有看到我应该如何使用格式引用的代码。

回答

2

记录器是在main()中设置的局部变量() 您需要在全局空间中声明它。

logger=None 
def setup(): 
    logger.debug('some text') 
    return 0 

def main(): 
    global logger 
    logger = logging.getLogger('some_logger_name') 
    logger.setLevel(logging.DEBUG) 

    ret = setup() 
+1

@Iafferc非常感谢! – mabe

1

日志记录不会暂停Python的通常范围规则。如果你在一个函数中定义了一个局部变量,它只能在该函数内部使用,并且这个变量适用于一个名为logger的变量,就像其他函数一样。

如果您希望模块中的所有功能都访问相同的logger变量,则需要在模块级别定义它。

+0

啊,我想我明白了。如果我在一个单独的文件(模块)中有例行程序'setup',它应该可以工作。或者,也可以使用@ lafferc的答案。我不知道本地函数与模块函数的处理方式不同。 – mabe