当前位置: 首页 > news >正文

英文响应式网站建设梦幻西游手游网页版官网

英文响应式网站建设,梦幻西游手游网页版官网,西安手机网站定制网站建设,企业网络安全解决方案Python 的 logging 模块提供了一个强大而灵活的日志系统。它是 Python 标准库的一部分#xff0c;因此可以在任何 Python 程序中使用。logging 模块提供了许多有用的功能#xff0c;包括日志消息的级别设置、日志消息的格式设置、将日志消息输出到不同的目标#xff0c;以及… Python 的 logging 模块提供了一个强大而灵活的日志系统。它是 Python 标准库的一部分因此可以在任何 Python 程序中使用。logging 模块提供了许多有用的功能包括日志消息的级别设置、日志消息的格式设置、将日志消息输出到不同的目标以及处理复杂的日志系统配置。 logging 组成部分 在 logging 模块中主要有四部分Logger、Handler、Filter 和 Formatter。下面分别对这四部分进行介绍。 Logger Logger 就是程序可以直接调用的一个日志接口可以直接向 Logger 写入日志信息。但是 Logger 并不是直接实例化使用的而是通过 logging.getLogger(name) 来获取对象事实上 Logger 对象是单例模式并且 logging 是多线程安全的也就是在程序的任何地方使用的同名的 Logger 都指向了一个实例。 Handler Handler 作用于 Logger是真正的日志处理程序一个 Logger 可以配置多个 Handler。同样的一个 Handler 也可以作用在多个 Logger 上。每个 Handler 同样有一个日志级别也就是说 Logger 可以根据不同的日志级别将日志传递给不同的 Handler当然也可以相同的级别传递给多个 Handler 这就根据需求来灵活的设置了。 Handler 既有系统定义的比如将日志输出到标准输出 stdout。也可以自定义日志处理器比如将日志发送到邮件或者第三方的日志存储介质等。 Filter Filter 提供了更细粒度的判断来决定日志是否需要打印。原则上 Handler 获得一个日志就必定会根据日志级别进行统一处理但是如果 Handler 拥有一个 Filter 的时候就可以对日志进行额外的处理和判断。例如 Filter 能够对来自特定源的日志进行拦截甚至进行修改包括日志级别的修改修改后再进行级别判断。 Logger 和 Handler 都可以安装 Filter 甚至可以安装多个 Filter 串联起来。 Formatter Formatter 指定了最终某条记录打印的格式。Formatter 会将传递来的信息拼接成一条具体的字符串默认情况下 Formatter 只会将信息 %(message)s 直接打印出来。Formatter 中有一些自带的属性可以使用如下表格 注意的是一个 Handler 只能拥有一个 Formatter。 日志级别 作用 日志级别是一个用于控制和过滤日志消息的重要工具。日志级别可以帮助更有效地管理日志只看到需要的信息而忽略不必要的细节。 这个功能在开发和运行大型程序时非常有用。例如在开发过程中你可能需要 DEBUG 级别的日志来找出问题。但是在生产环境中这么详细的日志可能会占用大量的磁盘空间而且大部分信息可能都是不必要的。因此在生产环境中你可能只需要 WARNING 或者 ERROR 级别的日志。 级别 在记录日志时, 日志消息都会关联一个级别“级别”本质上是一个非负整数。系统默认提供了6个级别它们分别是 级别对应值CRITICAL50ERROR40WARNING30INFO20DEBUG10NOTSET0 继承关系和处理流程 Logger 继承关系 Logger 对象是有父子关系的当没有父 Logger 对象时它的父对象是 root当拥有父对象时父子关系会被修正。举个例子logging.getLogger(abc.xyz) 会创建两个 Logger 对象一个是 abc 父对象一个是 xyz 子对象同时 abc 没有父对象所以它的父对象是 root。但是实际上 abc 是一个占位对象虚的日志对象可以没有 Handler 来处理日志。但是 root 不是占位对象如果某一个日志对象打日志时它的父对象会同时收到日志所以有些使用者发现创建了一个 Logger 对象时会打两遍日志就是因为他创建的 Logger 打了一遍日志同时 root 对象也打了一遍日志。 1level的继承 子 Logger 写日志时优先使用本身设置了的 level如果没有设置则逐层向上级父 Logger 查询直到查询到为止。最极端的情况是使用 root Logger 的默认日志级别 logging.WARNING。 参考源码 def getEffectiveLevel(self):Get the effective level for this logger.Loop through this logger and its parents in the logger hierarchy,looking for a non-zero logging level. Return the first one found.logger selfwhile logger:if logger.level:return logger.levellogger logger.parentreturn NOTSET2Handler 的继承 先将日志对象传递给子 Logger 的所有 Handler 处理处理完毕后如果该子 Logger 的 propagate 属性没有设置为 False则将日志对象向上传递给第一个父 Logger该父 Logger 的所有 Handler 处理完毕后如果它的 propagate 也没有设置为 False则继续向上层传递以此类推。最终的状态要么遇到一个 Logger它的 propagate 属性设置为了 False要么一直传递直到 root Logger 处理完毕。 注意Handler 不是真正的类继承只是“行为上的继承”也就是子 Logger 并没有没有绑定父类的 Handler。 参考源码 def callHandlers(self, record):Pass a record to all relevant handlers.Loop through all handlers for this logger and its parents in thelogger hierarchy. If no handler was found, output a one-off errormessage to sys.stderr. Stop searching up the hierarchy whenever alogger with the propagate attribute set to zero is found - thatwill be the last logger whose handlers are called.c selffound 0while c:for hdlr in c.handlers:found found 1if record.levelno hdlr.level:hdlr.handle(record)if not c.propagate:c None # break outelse:c c.parentif (found 0) and raiseExceptions and not self.manager.emittedNoHandlerWarning:sys.stderr.write(No handlers could be found for logger \%s\\n % self.name)self.manager.emittedNoHandlerWarning 1日志记录的处理流程 在一个给定继承关系的日志配置中如果其中任何一个 Logger 进行了日志记录会经历下面几个步骤 首先这条记录会被 Logger 本身的 Handler 进行处理。 检查日志级别是否满足最低要求是否有 Filter 进行更细粒度的处理用什么样的 Formatter 作为打印格式 默认 Logger 的 propagate 值为 True也就是在自己进行日志处理的同时也会把这条日志代理到其父 Logger 进行处理一直会被代理到 root Logger。 参考下面代码 import logging# root logger logging.basicConfig(levellogging.INFO)# parent logger logger_parent logging.getLogger(parent) handler logging.StreamHandler() handler.setLevel(logging.CRITICAL) # Set the handlers level to CRITICAL logger_parent.addHandler(handler) logger_parent.setLevel(levellogging.CRITICAL)# child logger logger_child logging.getLogger(parent.child) logger_child.addHandler(logging.StreamHandler()) logger_child.setLevel(levellogging.INFO)if __name__ __main__:logger_child.info(Hi)其输出结果为 Hi INFO:parent.child:Hi在上面代码中有三个日志记录器其继承关系分别是 logger_child 继承 logger_parent 继承 root。 每个日志记录器上设置的日志级别比如代码 logger_parent.setLevel(levellogging.CRITICAL) 不会影响记录器对日志的代理关系其影响的是这个记录器在使用时是否处理程序中的日志记录。比如 logger_parent 在使用的时候会忽略 CRITICAL 级别之下的日志。 在上述程序中 Hi 这条日志首先会被 logger_child 的 Handler 进行处理。然后这条记录会被代理到 logger_parentlogger_parent 的 handler 会对这条日志做处理由于 logger_parent 的 Handler 是 CRITICAL 级别的因此忽略这条日志。接下来这条日志会继续被代理到 rootroot 的 Handler 接下来会继续处理这条日志。 因此日志是否会被向上代理取决于 Logger 上的 propagate 属性。 使用实例 基本日志打印 在下面的例子中默认的日志级别是 WRANING因此只有最后一个日志被打印出来。 import logginglogging.debug(this is debug message) logging.info(this is info message) logging.warning(this is warning message)# 打印结果WARNING:root:this is warning messageroot 日志配置 在下面的例子中root 日志记录器可以通过 logging.basicConfig 进行配置比如配置其默认的日志级别Handler 或者输出格式等。 import logginglogging.basicConfig(levellogging.DEBUG, format%(asctime)s - %(name)s - %(message)s)if __name__ __main__:logging.debug(this is debug message)logging.info(this is info message)logging.warning(this is warning message) 结果 2024-06-06 17:10:43,873 - root - this is debug message 2024-06-06 17:10:43,873 - root - this is info message 2024-06-06 17:10:43,873 - root - this is warning message将日志同时输出到文件和 stdout 在下面的配置中定义了一个文件 Handler 和标准输出 Handler并将其应用到 logger 日志处理器上这样日志会同时被输出到文件和标准输出中。 如果你用 FileHandler 写日志文件的大小会随着时间推移而不断增大。为了避免这种情况出现可以在你的生成环境中使用 RotatingFileHandler 替代 FileHandler 做日志回滚。 import logginglogger logging.getLogger(__name__) logger.setLevel(levellogging.INFO)# 文件 Handler file_handler logging.FileHandler(log.txt) file_handler.setLevel(logging.INFO) formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) file_handler.setFormatter(formatter)# 标准输出 Handler console_handler logging.StreamHandler() console_handler.setLevel(logging.INFO)# 在 logger 中应用这两个 Handler logger.addHandler(file_handler) logger.addHandler(console_handler)logger.info(Start print log) logger.debug(Do something) logger.warning(Something maybe fail.) logger.info(Finish)使用适配器扩展 在下面的例子中通过 logging 提供的 LoggerAdapter 方法可以对日志的字段进行扩展输出的时候通过适当的 Formatter 进行扩展字段的输出。 import loggingformat_str %(levelname)s %(filename)s %(document_id)s %(message)s logging.basicConfig(levellogging.INFO, formatformat_str)logger logging.getLogger(__name__)extra {document_id: doc id} logger logging.LoggerAdapter(logger, extra)logger.info({name: Xiao Ming})# INFO example_use_adapter.py doc id {name: Xiao Ming}捕捉异常并使用 traceback 记录 当程序出现错误的时候在使用 Logger 进行记录的时候通过设置参数 exc_infoTrue 可以在日志中记录详细的报错信息。 import logginglogger logging.getLogger(__name__)try:open(/path/to/does/not/exist, rb) except Exception as e:logger.error(Failed to open file, exc_infoTrue) Failed to open file Traceback (most recent call last):File /Users/crown/Projects/python101/playground/logging_watchtower/example_traceback.py, line 6, in moduleopen(/path/to/does/not/exist, rb) FileNotFoundError: [Errno 2] No such file or directory: /path/to/does/not/exist通过配置文件 如果日志的配置比较复杂可以考虑通过外置配置文件的方式进行 logging 配置logging 模块支持 json 格式和 yaml 两种格式的配置文件通过配置文件可以更清晰的进行负责日志的配置。 下面是通过 json 配置文件的方式对 logging 进行配置。 {version: 1,disable_existing_loggers: false,formatters: {simple: {format: %(asctime)s - %(name)s - %(levelname)s - %(message)s}},handlers: {console: {class: logging.StreamHandler,level: DEBUG,formatter: simple,stream: ext://sys.stdout},info_file_handler: {class: logging.handlers.RotatingFileHandler,level: INFO,formatter: simple,filename: info.log,encoding: utf8}},loggers: {my_module: {level: ERROR,handlers: [info_file_handler],propagate: no}},root: {level: INFO,handlers: [console,info_file_handler]} }在 python 中读取配置文件 {version: 1,disable_existing_loggers: false,formatters: {simple: {format: %(asctime)s - %(name)s - %(levelname)s - %(message)s}},handlers: {console: {class: logging.StreamHandler,level: DEBUG,formatter: simple,stream: ext://sys.stdout},info_file_handler: {class: logging.handlers.RotatingFileHandler,level: INFO,formatter: simple,filename: info.log,encoding: utf8}},loggers: {my_module: {level: ERROR,handlers: [info_file_handler],propagate: no}},root: {level: INFO,handlers: [console,info_file_handler]} }参考文档 [1] python基础学习十 logging模块详细使用 https://www.cnblogs.com/louis-w/p/8567434.html [2] github django logging https://github.com/django/django/blob/1586a09b7949bbb7b0d84cb74ce1cadc25cbb355/django/utils/log.py#L18
http://www.zqtcl.cn/news/510614/

相关文章:

  • wordpress视频付费谷歌seo专员是指什么意思
  • 域名续费做网站wordpress模板淘宝客模板
  • 加强政协机关网站建设深圳教育软件app开发
  • 绍兴企业网站推广Django 个人博客网站开发
  • html5 开发网站图门市建设局网站
  • wordpress 建立网站江苏电信网站备案
  • 企业网站能个人备案吗成都蜀美网站建设
  • 网站开发 占位符直播网站开发接入视频
  • 网站 易用性原则义乌进货网平台
  • 做网站的你选题的缘由是什么洛阳网站建设找汉狮
  • 常德住房和城乡建设局网站陕西省建设厅的网站
  • 国外做meta分析的网站开发公司替业主承担物业费承诺书
  • 百度收录网站定位地址wordpress 检测浏览器
  • 学习网站建设优化wordpress 轮播广告
  • 迈诺网站建设wordpress 前台注册登录
  • 网站开发市场成本免费建站网站大全
  • 四川省建设人才网站通过ip访问网站需要怎么做
  • 网站建设需要知道什么财税公司怎么找客源
  • 赣州那里有做网站的公司物流网站建设平台
  • 青色系网站北京的建筑设计公司
  • 纺织品做外贸一般在哪个网站上手机网站qq登录插件
  • 长沙做公司网站有没有免费的云服务器可以用
  • 济南专业网站优化如何制作小程序二维码
  • 建站平台软件猪八戒做网站要多少钱
  • 建设集团网站专业开发网站多少钱
  • 网站制作流程有哪些wordpress众筹
  • 网站打开是建设中手机咋建网站
  • 外贸专业网站的公司建百度网站
  • 北京做网站开发公司有哪些网站技术开发文档模板
  • 图解asp.net网站开发实战外管局网站先支后收怎么做报告