我试图使用标准库来调试我的代码:
这很好用:
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('message')
我无法让较低级别的记录器工作:
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.info('message')
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug('message')
我都没有得到任何答复。
答案 0 :(得分:31)
什么是Python版本?这在3.4中为我工作。但请注意basicConfig()如果已经设置了根管理器,则不会影响它:
如果根记录器已经为其配置了处理程序,则此函数不执行任何操作。
要明确地在root上设置级别,请执行logging.getLogger().setLevel(logging.DEBUG)
。但请确保您事先调用basicConfig()
,以便根记录器最初具有一些设置。即:
import logging
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
logging.getLogger('foo').debug('bah')
logging.getLogger().setLevel(logging.INFO)
logging.getLogger('foo').debug('bah')
另请注意" Loggers"和他们的"处理程序"两者都有不同的独立日志级别。因此,如果您以前在Python脚本中明确加载了一些复杂的记录器配置,并且已经与根记录器的处理程序混乱,那么这可能会产生影响,并且只是更改记录器日志级别使用logging.getLogger().setLevel(..)
可能无效。这是因为附加的处理程序可能具有独立设置的日志级别。这种情况不太可能发生,而且通常不必担心。
答案 1 :(得分:6)
我使用以下设置进行记录
像这样
创建一个名为 logging.yml 的yaml文件version: 1
formatters:
simple:
format: "%(name)s - %(lineno)d - %(message)s"
complex:
format: "%(asctime)s - %(name)s - %(lineno)d - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
file:
class: logging.handlers.TimedRotatingFileHandler
when: midnight
backupCount: 5
level: DEBUG
formatter: simple
filename : Thrift.log
loggers:
qsoWidget:
level: INFO
handlers: [console,file]
propagate: yes
__main__:
level: DEBUG
handlers: [console]
propagate: yes
“main”模块应如下所示
import logging.config
import logging
with open('logging.yaml','rt') as f:
config=yaml.safe_load(f.read())
f.close()
logging.config.dictConfig(config)
logger=logging.getLogger(__name__)
logger.info("Contest is starting")
这些应该像这样开始
import logging
class locator(object):
def __init__(self):
self.logger = logging.getLogger(__name__)
self.logger.debug('{} initialized')
希望能帮到你......
答案 2 :(得分:2)
在我看来,这是大多数情况下的最佳方法。
在项目根目录下创建一个文件名logging.ini
如下:
[loggers]
keys=root
[logger_root]
level=DEBUG
handlers=screen,file
[formatters]
keys=simple,verbose
[formatter_simple]
format=%(asctime)s [%(levelname)s] %(name)s: %(message)s
[formatter_verbose]
format=[%(asctime)s] %(levelname)s [%(filename)s %(name)s %(funcName)s (%(lineno)d)]: %(message)s
[handlers]
keys=file,screen
[handler_file]
class=handlers.TimedRotatingFileHandler
interval=midnight
backupCount=5
formatter=verbose
level=WARNING
args=('debug.log',)
[handler_screen]
class=StreamHandler
formatter=simple
level=DEBUG
args=(sys.stdout,)
然后配置如下:
import logging
from logging.config import fileConfig
fileConfig('logging.ini')
logger = logging.getLogger('dev')
name = "stackoverflow"
logger.info(f"Hello {name}!")
logger.critical('This message should go to the log file.')
logger.error('So should this.')
logger.warning('And this, too.')
logger.debug('Bye!')
如果您运行脚本,sysout
将是:
2021-01-31 03:40:10,241 [INFO] dev: Hello stackoverflow!
2021-01-31 03:40:10,242 [CRITICAL] dev: This message should go to the log file.
2021-01-31 03:40:10,243 [ERROR] dev: So should this.
2021-01-31 03:40:10,243 [WARNING] dev: And this, too.
2021-01-31 03:40:10,243 [DEBUG] dev: Bye!
并且 debug.log
文件应包含:
[2021-01-31 03:40:10,242] CRITICAL [my_loger.py dev <module> (12)]: This message should go to the log file.
[2021-01-31 03:40:10,243] ERROR [my_loger.py dev <module> (13)]: So should this.
[2021-01-31 03:40:10,243] WARNING [my_loger.py dev <module> (14)]: And this, too.
大功告成。
答案 3 :(得分:0)
我想将默认记录器保留在警告级别,但我的代码有详细的低级别记录器。但它不会显示任何东西。基于另一个答案,预先运行 logging.basicConfig()
至关重要。
import logging
logging.basicConfig()
logging.getLogger('foo').setLevel(logging.INFO)
logging.getLogger('foo').info('info')
logging.getLogger('foo').debug('info')
logging.getLogger('foo').setLevel(logging.DEBUG)
logging.getLogger('foo').info('info')
logging.getLogger('foo').debug('debug')
预期输出
INFO:foo:info
INFO:foo:info
DEBUG:foo:debug
对于跨模块的日志记录解决方案,我这样做了
# cfg.py
import logging
logging.basicConfig()
logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
logger.info(f'active')
# main.py
import cfg
cfg.logger.info(f'main')