试图理解并学习如何编写包...用我一直使用的东西进行测试,记录......
你能帮我理解为什么'log'变量不起作用......并且屏幕上没有记录功能吗?
谢谢!
main.py:
#!/opt/local/bin/python
import sys
sys.path.append('CLUSTER')
import clusterlogging.differentlogging
clusterlogging.differentlogging.consolelogging()
log.debug("Successfully logged in")
differentlogging.py
#!/opt/local/bin/python
def consolelogging():
import logging
class NullHandler(logging.Handler):
def emit(self, record):
pass
print "Console Logging loaded"
DEFAULTLOGLEVEL=logging.INFO
log = logging.getLogger(__name__)
log.addHandler(NullHandler())
log.debug("Successfully logged in")
def mysqllogging():
print "mysql logging module here"
def sysloglogging():
print "rsyslog logging module here"
输出
Console Logging loaded
Traceback (most recent call last):
File "./svnprod.py", line 10, in <module>
log.debug("Successfully logged in")
NameError: name 'log' is not defined
答案 0 :(得分:4)
log
是differentlogging
模块中的全局变量。因此,您可以访问它
clusterlogging.differentlogging.log
。
您也可以执行from clusterlogging.differentlogging import log
之类的操作,然后将其作为log
进行访问。
编辑:实际上,在重新审核您的代码时,我不知道该怎么做。你可以修改你的代码缩进,这样才有意义吗?您是否在log
函数中定义了consolelogging
?如果是这样,您需要使用global log
将其设置为全局,或者从函数返回它并将其分配给调用函数的行上的变量log
。
答案 1 :(得分:0)
您的main.py
无法在全局命名空间中定义名称log
。导入模块可以在该模块的命名空间中定义名称,但不能在全局命名空间中放置任何内容。
在main.py
中,您应该添加以下声明:
from clusterlogging.differentlogging import log
顺便说一句,我是一个如此长的模块名称,我会使用import as
:
import clusterlogging.differentlogging as difflogging
log = difflogging.log
编辑:我最初推荐这个,但它不起作用:
from difflogging import log # doesn't work
您甚至可能想要使用一个非常简短的名称,例如dl
:
import clusterlogging.differentlogging as dl
dl.log('whatever')
由于dl
非常短,所以您可能不需要在全局命名空间中绑定log
。
此外,您可以使用import *
从模块中获取每个名称,但不建议这样做。
from clusterlogging.differentlogging import * # not recommended
您通常不希望使用模块中定义的所有内容来混淆全局命名空间。导入你需要的东西。这更整洁,有助于记录您实际使用的内容。
答案 2 :(得分:0)
这将返回日志数组,您将能够使用关联的日志记录功能。
main.py:
#!/usr/bin/env python
import sys
sys.path.append('CLUSTER')
import clusterlogging.differentlogging
log=clusterlogging.differentlogging.ttylogging()
log.debug("Logging module loaded")
log.info ("It worked")
differentlogging.py:
#!/usr/bin/env python
def ttylogging():
print "Console Logging loaded"
import sys
import logging
class NullHandler(logging.Handler):
def emit(self, record):
pass
DEFAULTLOGLEVEL=logging.INFO
log = logging.getLogger(__name__)
log.addHandler(NullHandler())
log.setLevel(DEFAULTLOGLEVEL)
logStreamHandler = logging.StreamHandler(sys.stdout)
logStreamHandler.setFormatter(logging.Formatter("%(asctime)s %(levelname)5s %(name)s %(lineno)d: %(message)s"))
log.addHandler(logStreamHandler)
return log
def mysqllogging():
print "mysql logging module here"
def sysloglogging():
print "rsyslog logging module here"