当前位置: 代码迷 >> python >> 本地功能无法识别记录器
  详细解决方案

本地功能无法识别记录器

热度:96   发布时间:2023-06-13 15:00:08.0

我有一个python代码(下面),它在下面进一步发出错误,我不明白问题出在哪里。 据我所知,从这个 ,记录器应该可用于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,抱歉奇怪的编辑。 我没有看到我应该如何格式引用代码。

记录器是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()

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

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

  相关解决方案