我正在创建一个需要初始化记录器的类。
我希望能够选择记录器的“记录级别”(信息,警告,错误)。
我想过使用这样的参数:
class classA:
def __init__(self, logLevel = 'info'):
#stuff
#initialize logger
self.logger.setLevel(logLevel)
但我很确定这不起作用。
所以我想用logLevel
替换getLogLevel(logLevel)
。 getLogLevel
看起来像这样:
def getLogLevel(logLevel):
if logLevel == 'info':
return 'logging.INFO'
elif .......
但是这里出现了一个问题。我很确定我不能像这样返回'代码'。
有没有办法让这个更干净而不会使__init__
方法混乱?
(顺便说一句,我知道你可以使用一种方法来处理带有基于logLevel
的if语句的记录器,但是我想知道是否有多种方法可以做到这一点。)
答案 0 :(得分:3)
您正在使用字符串,其中日志记录枚举更合适。
例如
class classA:
def __init__(self, logLevel = logging.INFO):
#stuff
#initialize logger
self.logger.setLevel(logLevel)
或者如果你想把它保存为一个字符串(你没有)并使用getLogLevel()
更改如下:
def getLogLevel(logLevel):
if logLevel == 'info':
return logging.INFO
elif .......
答案 1 :(得分:2)
从Python 3.2+开始,stdlib logging
模块的记录器接受日志级别的字符串表示。他们只需要大写。
class A:
def __init__(self, log_level='info'):
...
self.logger.setLevel(log_level.upper())
这些记录器将它们的级别存储为整数,但您可以轻松地返回字符串表示。
logging.getLevelName(logger.level)
答案 2 :(得分:1)
使用getattr
,您可以从logging
模块中获取对象。试试这个:
class classA:
def __init__(self, logLevel = 'info'):
#initialize logger
self.logger.setLevel(getattr(self.logger, logLevel.upper()))
每个日志级别都有一个数值:
>>> import logging
>>> logging.INFO
20
>>> logging.ERROR
40
使用getattr
您可以传递字符串和对象以获取属性的值:
>>> getattr(logging, 'INFO')
20
>>> getattr(logging, 'ERROR')
40
请注意,字符串必须为大写。
这段代码看起来有点复杂,因为我们已经链接了函数调用。 有些人可能会发现此代码更清晰:
class classA:
def __init__(self, logLevel = 'info'):
#initialize logger
self.set_loglvl(logLevel)
def set_loglvl(self, lvl):
l = getattr(self.logger, lvl)
self.logger.setLevel(self.loglvl(logLevel))