我正在尝试使用标准库来调试我的代码:
这很好用:
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('message')
Run Code Online (Sandbox Code Playgroud)
我无法为较低级别的记录器工作:
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.info('message')
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug('message')
Run Code Online (Sandbox Code Playgroud)
我没有得到任何回应.
spi*_*kus 47
什么是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')
Run Code Online (Sandbox Code Playgroud)
另请注意,"Loggers"及其"Handlers"都具有不同的独立日志级别.因此,如果您以前在Python脚本中明确加载了一些复杂的记录器配置,并且已经与根记录器的处理程序混淆了,那么这可能会产生影响,只是更改记录器日志级别logging.getLogger().setLevel(..)可能不起作用.这是因为附加的处理程序可能具有独立设置的日志级别.这种情况不太可能发生,而且通常不必担心.
我认为,对于大多数情况来说,这是最好的方法。
在项目根目录下创建一个文件名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,)
Run Code Online (Sandbox Code Playgroud)
然后配置如下:
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!')
Run Code Online (Sandbox Code Playgroud)
如果运行该脚本,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!
Run Code Online (Sandbox Code Playgroud)
文件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.
Run Code Online (Sandbox Code Playgroud)
全做完了。
我使用以下设置进行日志记录
像这样创建一个名为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
Run Code Online (Sandbox Code Playgroud)
"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")
Run Code Online (Sandbox Code Playgroud)
这些应该像这样开始
import logging
class locator(object):
def __init__(self):
self.logger = logging.getLogger(__name__)
self.logger.debug('{} initialized')
Run Code Online (Sandbox Code Playgroud)
希望能帮到你......
我想将默认记录器保留在警告级别,但为我的代码提供了详细的较低级别记录器。但它不会显示任何东西。基于另一个答案,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')
Run Code Online (Sandbox Code Playgroud)
预期产出
INFO:foo:info
INFO:foo:info
DEBUG:foo:debug
Run Code Online (Sandbox Code Playgroud)
对于跨模块的日志记录解决方案,我这样做了
# 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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32495 次 |
| 最近记录: |