logging 模块的 dictConfig

  • logging 模块配置 log 的方式
    • 1. `logging.basicConfig()`
    • 2. 自定义 `logger`
    • 3. `logging.config.XXX`
  • 参考

logging 模块配置 log 的方式

1. logging.basicConfig()

"""
logging.basicConfig(filename,filemode,format,datefmt,style,level,stream,handlers
)
"""
import logging_format = ('%(asctime)s ''%(name)s '  # the name of logger'%(levelname)s ''%(filename)s ''%(threadName)s ''%(lineno)d: ''%(message)s')
logging.basicConfig(level=logging.DEBUG,  # 默认 level 是 WARNINGfilename='test.log',format=_format,
)logging.debug('logging debug')
logging.info('logging info')

2. 自定义 logger

logging.basicConfig 的配置项进行拆分, 自定义 logger, 然后逐步配置.
自定义 一个 logger 的步骤:

  1. 获取一个 logger: logging.getLogger(...)
  2. 设置 level: logger.setLevel(...)
  3. 定义一个/多个 formatter: logging.Formatter(...)
  4. 定义一个/多个 handler: logging.XXXHandler(...)
  5. 为一个 handler 设置一个 fomatter: hd.setFormatter(...)
  6. 为一个 handler 设置 level: hd.setLevel(...)
  7. 添加所有 handler 到一个 logger: logger.addHandler(...), …
  8. 定义一个/多个 filter: class MyFilter(logging.Filter): ...
  9. 添加所有 filter 到 logger: logger.addFilter(...), …
import logging# 获取一个 logger
logger = logging.getLogger(__name__)# 为 logger 设置 level
logger.setLevel(logging.DEBUG)# 定义一个 formatter
formatter = logging.Formatter('%(levelname)s:%(name)s %(asctime)s %(funcName)s: %(message)s'
)# 定义一个 handler, 存储 INFO 及 INFO 以上级别的日志
# 为了看方便测试结果, 将 mode 设为 w, 不追加
info_hd = logging.FileHandler('log1_info.log', mode='w')
info_hd.setFormatter(formatter)  # 为 handler 设置 formatter
info_hd.setLevel(logging.INFO)   # 为 handler 设置 level# 定义另一个 handler, 存储 ERROR 及 ERROR 以上级别的日志
err_hd = logging.FileHandler('log1_error.log', mode='w')
err_hd.setFormatter(formatter)
err_hd.setLevel(logging.ERROR)# 定义一个 handler, 用于 在控制台中打印 所有级别的日志
stream_hd = logging.StreamHandler()
stream_hd.setFormatter(formatter)
stream_hd.setLevel(logging.DEBUG)# 添加所有 handler 到 logger
logger.addHandler(info_hd)
logger.addHandler(err_hd)
logger.addHandler(stream_hd)# 实际定义 logger 时, 一般定义不同的 formatter, 用于存储/打印不同细节的日志def foo():# 使用自定义 logger 打印日志logger.debug('test user defined logger DEBUG')logger.info('test user defined logger INFO')logger.warning('test user defined logger INFO')logger.error('test user defined logger ERROR')logger.critical('test user defined logger ERROR')# 测试 logger.exception(), 记录异常(ERROR级别)的堆栈信息
def log_exc():try:1 / 0except ZeroDivisionError:logger.exception('tried to divide by 0')if __name__ == '__main__':foo()log_exc()

3. logging.config.XXX

这里只记录 logging.config.dictConfig.

"""
顶级配置项:versionformattersfiltershandlersloggersrootincrementaldisable_existing_loggers
"""LOG_CONF = {'version': 1,'formatters': {'formatter_1': {'format': '%(levelname)s:%(name)s %(asctime)s: %(message)s','datefmt': None},'formatter_2': {'format': '%(levelname)s - %(name)s - %(message)s','datefmt': None}},'filters': {'filter_1': {'()': myFilter1,      # 使用 `()` 指定用哪个类来实现过滤功能'name': 'name1'       # name 的值会在 Filter 实例化时传入}},'handlers': {'handler_1': {    # 指定一个文件 handler, 仅保存 ERROR 及其以上级别的日志'class': 'logging.FileHandler','level': logging.ERROR,'formatter': 'formatter_1','filters': ['filter_1'],'filename': LOG_DIR / 'test_dict_config_err.log',  # 需要先创建目录},'handler_2': {    # 指定一个 stream handler, 打印 DEBUG 及其以上级别的日志'class': 'logging.StreamHandler','level': logging.DEBUG,'formatter': 'formatter_2',# 'filters': ['filter_1']}},'loggers': {'my_logger1': {'level': logging.WARNING,  # 在这里指定的 level, 优先级比 handler 中的 level 更高# Logger 对象被设计为一个树形结构.  print(logger.parent)# 子logger 在完成对日志消息的处理后,默认会将日志消息传递给它的 parent logger'propagate': False,  # 1/0/True/False, 是否传递给父节点的 logger 来处理'filters': ['filter_1'],  # 在这里指定的 filter, 优先级比 handler 中的 filter 更高'handlers': ['handler_1', 'handler_2']}},'root': {  # 专门配置 root logger'level': logging.DEBUG,# 'propagate': 1,  # 对于 root logger 来说, propagate 零作用'filters': [],'handlers': ['handler_2']  # 为了测试 propagate, 需要指定一个 handler},'incremental': False,'disable_existing_loggers': True
}

上面代码中的 myFilter1LOG_DIR

import logging
from pathlib import PathLOG_DIR = Path('logs')
LOG_DIR.mkdir(exist_ok=True)class myFilter1(logging.Filter):def filter(self, record: logging.LogRecord) -> bool:"""返回 True 时, 此条日志过滤, 不会打印和保存返回 False 时, 不过滤, 会打印或保存"""# 如果日志 message 中带有`test filter`, 则忽略此条日志if 'test filter' in record.getMessage():return Falsereturn True

测试

import logging
from logging import configfrom config.dict_config import LOG_CONFlogger = logging.getLogger('my_logger1')# Logger 对象被设计为一个树形结构
print(logger.parent)# 使配置生效
config.dictConfig(LOG_CONF)def foo():logger.debug('dictConfig DEBUG')logger.info('dictConfig INFO')logger.warning('dictConfig WARNING')logger.error('dictConfig ERROR')logger.critical('dictConfig CRITICAL')try:1 / 0except ZeroDivisionError:logger.exception('dictConfig logger.exception')logger.error('xxxx test filter xxx')foo()

参考

  • python 3.7 log 文档
  • python3.7 Logging Cookbook

Python logging 模块的 dictConfig相关推荐

  1. python logging模块-写日志、log回滚

    python包/模块,专栏总目录: 1.python自定义模块 2.python模块调用顺序 3.python logging模块 4.python定义跨模块的全局变量 1.logging模块简介 l ...

  2. 关于使用python logging模块的几点总结

    关于使用python logging模块的几点总结 使用python的标准日志模块logging可以非常方便地记录日志.Python日志系统非常丰富.添加结构化或非结构化日志输出到python代码,写 ...

  3. python logging模块使用

    python logging模块使用 logging模块 日志记录的重要性 在开发过程中,我们可以printf或者Debug来排查问题. 但是在生产环境中(黑盒环境)出现问题,我们并不能知道在运行的环 ...

  4. python logging模块使用_python logging模块使用

    近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- importloggin ...

  5. Python logging模块切分和轮转日志

    Python logging模块切分和轮转日志 logging 模块可以实现日志的输出和写入文件,但实际工作中,对于日志是使用不仅限于输出那么简单. logging基本使用参考:https://blo ...

  6. Python logging模块的基本使用

    Python logging模块的基本使用 logging 模块是 Python 内置的标准模块,用于输出代码日志. 一.logging 模块简介 在工作中,运行的代码量是非常大的,为了更方便的管理代 ...

  7. python调用微信客户端_python模拟微信客户端打开链接Python Logging 模块研究

    背景 在一个新的项目里面加入了日志功能,想自己写一个,但是一个偶然的机会,通过google发现Python内建了一个非常强大的日志(log)模块:logging.粗略的研究了一下,下面是我的一些心得札 ...

  8. python logging模块使用教程

    格式化配置: logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(filename)s [%(lin ...

  9. (转)python logging模块

    原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日 ...

最新文章

  1. pycharm 汉化
  2. HTML(WEB)开发day01
  3. 【探索】Web新概念——资料横向显示(欢迎点评)
  4. JavaFX中的塔防
  5. 从JS敏感信息泄露到GETSHELL
  6. 《企业软件交付:敏捷与高效管理精要》——3.4 企业软件交付的软件工厂方法...
  7. sprintf用法详解
  8. 吴恩达 神经网络和深度学习 第一课 第一周(笔记,代码,数据集)
  9. 【译】如何写出一份优秀的软件设计文档
  10. 【老孙随笔】怎样才能当上项目经理?
  11. Delphi中Format与FormatDateTime函数详解
  12. 函数式编程( Functional)与命令式编程( Imperative)对比
  13. 产品出口到沙特要做SGS或BV的清关SASO证书,请问哪里办理最迅速?
  14. PreparedStatement的用法
  15. iOS 性能优化之内存优化
  16. #include <netinet/in.h> #include <netdb.h> 在windows下对应什么头文件
  17. Longest Word
  18. ANSYS CFX19.0中的SA模型设置
  19. org.elasticsearch.discovery.MasterNotDiscoveredException异常解决
  20. 矩阵中行向量两两之间的欧氏距离

热门文章

  1. 互联网基础结构发展的三个阶段及其特点
  2. 撞车之后,不要傻里傻气的!这里有绝招!
  3. 苹果cms采集教程,设置定时采集方法
  4. steam提示:近期内来自您网络的登录失败过多,请稍后重试
  5. 如何在github下载源码
  6. 短视频制作素材都在这了
  7. 享打印机提示无法保存打印机设置,操作无法完成
  8. C++中的iterator-second
  9. 更换计算机密码 保护屏障,电脑密码怎么设置
  10. 使用tcgames电脑玩手机游戏助手玩手游常见问题第二期