Loading... logging 是 python 的内置库,主要用于进行格式化内容输出,可将格式化内容输出到文件,也可输出到屏幕。我们在开发过程中常用 print 函数来进行调试,但是实际应用部署时我们要将日志的信息要输出到文件中,方便后续查找以及备份。 | 危急 | 细节信息,仅当诊断问题时适用。 | 50 | | -------- | ------------------------------------------------------------ | ---- | | 错误 | 确认程序按预期运行。 | 40 | | 警告 | 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行。 | 30 | | 信息 | 由于严重的问题,程序的某些功能已经不能正常执行 | 20 | | 调试 | 严重的错误,表明程序已不能继续执行 | 10 | | 没有设置 | | 0 | ## 简单示例 ```python import logging # 消息将写入控制台 logging.debug('This is a debug message') logging.info('This is an info message') logging.warning('This is a warning message') logging.error('This is an error message') logging.critical('This is a critical message') ``` ## 有效日志级别 ```python import logging logger = logging.getLogger() # 根级别 main_logger.setLevel(5) dev_logger = logging.getLogger('main.dev') print(main_logger.getEffectiveLevel()) # 5 print(dev_logger.getEffectiveLevel()) # 5 ``` ## 日志处理程序 ```python # 日志文件 fileHandler = logging.FileHandler('test.log') fileHandler.setLevel(logging.INFO) # 控制台 ## 如果未指定流,则使用 sys.stderr consoleHandler = logging.StreamHandler() consoleHandler.setLevel(logging.INFO) # 添加 handler logger.addHandler(fileHandler) logger.addHandler(consoleHandler) logger.info('information message') ``` ## 日志格式化程序 ```python import logging logger = logging.getLogger('dev') logger.setLevel(logging.INFO) consoleHandler = logging.StreamHandler() consoleHandler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s: %(message)s') consoleHandler.setFormatter(formatter) logger.addHandler(consoleHandler) logger.info('information message') ``` ## 日志 basicConfig ```python logging.basicConfig(filename='test.log', format='%(filename)s: %(message)s', level=logging.DEBUG, datefmt='%Y-%m%d %H:%M:%S') ``` `fileConfig()`从 `configparser` 格式文件中读取日志配置。 `log.conf` 类似于 `ini`文件 ```ini [loggers] keys=root,dev [handlers] keys=consoleHandler [formatters] keys=extend,simple [logger_root] level=INFO handlers=consoleHandler [logger_dev] level=INFO handlers=consoleHandler qualname=dev propagate=0 [handler_consoleHandler] class=StreamHandler level=INFO formatter=extend args=(sys.stdout,) [formatter_extend] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s [formatter_simple] format=%(asctime)s - %(message)s ``` ```python import logging import logging.config logging.config.fileConfig(fname='log.conf') logger = logging.getLogger('dev') logger.info('This is an information message') ``` Python 日志 `YAML` 配置 ```bash pip install pyyaml ``` ```yaml version: 1 formatters: simple: format: "%(asctime)s %(name)s: %(message)s" extended: format: "%(asctime)s %(name)s %(levelname)s: %(message)s" handlers: console: class: logging.StreamHandler level: INFO formatter: simple file_handler: class: logging.FileHandler level: INFO filename: test.log formatter: extended propagate: false loggers: dev: handlers: [console, file_handler] test: handlers: [file_handler] root: handlers: [file_handler] ``` ```python import logging import logging.config import yaml with open('config.yaml', 'r') as f: log_cfg = yaml.safe_load(f.read()) logging.config.dictConfig(log_cfg) logger = logging.getLogger('dev') logger.setLevel(logging.INFO) logger.info('This is an info message') logger.error('This is an error message') ``` ## 日志变量 ```python error_message = 'authentication failed' logger.error(f'error: {error_message}') ``` ## 日志堆栈跟踪 ```python vals = [1, 2] try: print(vals[4]) except Exception as e: logger.error("exception occurred", exc_info=True) ``` ## 参考 [Python 日志教程](https://geek-docs.com/python/python-tutorial/python-logging.html) [python日志处理框架logging精讲](https://www.jianshu.com/p/bab98162b4c9) 最后修改:2022 年 03 月 01 日 02 : 31 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信