Python Logging setlevel

Jak*_*Jak 49 python logging

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

目前我正在使用这个:

Log = logging.getLogger('myLogger')
Log.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

但我想要这个:

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)
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用 - 它只是没有记录任何东西.我正在这样做,以便我可以从单个配置文件中的变量设置一大堆脚本的日志记录级别.如果我在这里遗漏了一些明显的东西,我很抱歉!

Séb*_*rra 99

你也应该能够这样做:

Log = logging.getLogger('myLogger')
level = logging.getLevelName('INFO')
Log.setLevel(level)
Run Code Online (Sandbox Code Playgroud)

logging.getLevelName(lvl)功能兼顾两种方式.我使用它,它的工作原理(你应该检查你的python实现).

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

干杯!

  • 引用:"在3.4之前的Python版本中,此函数也可以传递给文本级别,并返回该级别的相应数值.这种未记录的行为被认为是一个错误,并在Python 3.4中删除,但在3.4中恢复.2由于保留向后兼容性." (8认同)

sve*_*erg 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()
Run Code Online (Sandbox Code Playgroud)


jrc*_*jrc 6

logging.setLevel()接受一个 int一个 str。

因此,以下工作正常(至少在 Python 3.7 中):

logger = logging.getLogger(__name__)
logger.setLevel("DEBUG")
Run Code Online (Sandbox Code Playgroud)


Ine*_*ego 5

getattrlogging模块上使用怎么样?

import logging
str_level = 'DEBUG'
level = getattr(logging, str_level)
logger = logging.getLogger("my_logger")
logger.setLevel(level)
print(logger.getEffectiveLevel())
Run Code Online (Sandbox Code Playgroud)