59

有谁知道是否有办法在 Python 的 Logging 模块的 setlevel() 函数中使用变量?

目前我正在使用这个:

Log = logging.getLogger('myLogger')
Log.setLevel(logging.DEBUG)

但我想要这个:

Log = logging.getLogger('myLogger')
levels = {'CRITICAL' : logging.critical,
    'ERROR' : logging.error,
    'WARNING' : logging.warning,
    'INFO' : logging.info,
    'DEBUG' : logging.debug
}
level = levels['INFO']
Log.setLevel(level)

但它似乎不起作用 - 它只是没有记录任何东西。

我这样做是为了可以从单个配置文件中的变量为一大堆脚本设置日志记录级别。

4

6 回答 6

132

您还应该能够做到这一点:

Log = logging.getLogger('myLogger')
level = logging.getLevelName('INFO')
Log.setLevel(level)

logging.getLevelName(lvl)功能双向工作。我使用它,它可以工作(不过你应该检查你的 python 实现)。

这样可以省去维护自己字典的麻烦,并减少拼写错误的可能性。

于 2013-03-12T17:31:04.297 回答
8

我在使用 python 3 时遇到了问题,这对我有用: https ://docs.python.org/3/howto/logging.html

# 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()
于 2015-08-20T09:34:14.307 回答
7

logging.setLevel()需要一个 int一个 str。

所以以下工作很好(至少在 Python 3.7 中):

logger = logging.getLogger(__name__)
logger.setLevel("DEBUG")
于 2019-03-26T09:37:05.957 回答
5

getattrlogging模块上使用怎么样?

import logging
str_level = 'DEBUG'
level = getattr(logging, str_level)
logger = logging.getLogger("my_logger")
logger.setLevel(level)
print(logger.getEffectiveLevel())
于 2017-10-31T04:23:00.370 回答
3

我发现利用可选的环境变量非常方便和灵活:

class Foo():
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        level = logging.getLevelName(os.environ.get('LOG_LEVEL', 'ERROR'))
        logging.basicConfig(level=level)

    def bar(self):
        self.logger.debug('Log something')
于 2019-10-09T18:29:27.080 回答
0

我能够在下面得到这个工作。我在 Docker 中使用它时添加了一个环境变量部分,但您可以根据需要添加它。这样您就可以选择您需要的内容并重新运行您的脚本。

#Manual Testing Variables If Needed
#os.environ["LOG_LEVEL_SELECTOR"] = "DEBUG, INFO, or ERROR"

#Setting Log Level Test
logger = logging.getLogger('json')
logger.addHandler(json_handler_out)
logger_levels = {
    'ERROR' : logging.ERROR,
    'INFO' : logging.INFO,
    'DEBUG' : logging.DEBUG
}
logger_level_selector = os.environ["LOG_LEVEL_SELECTOR"]
logger.setLevel(logger_level_selector)
于 2020-09-23T19:27:17.647 回答