你的位置:皇冠网址 > 皇冠投注网 > 重庆时时彩龙虎斗网页加载问题_为什么Pycharm输出的日记一谈是红色!
重庆时时彩龙虎斗网页加载问题_为什么Pycharm输出的日记一谈是红色!
发布日期:2023-10-30 02:41    点击次数:159

重庆时时彩龙虎斗网页加载问题_为什么Pycharm输出的日记一谈是红色!

重庆时时彩龙虎斗网页加载问题_

幸运快艇色碟

皇冠体育注册

在上一篇著作1万字详解 python logging日记模块 中,真切浅出的教练了日记的基欢跃趣与用法。但还有一些内容并莫得触及到,是以这篇著作当作上一篇著作的补充。

但愿这两篇著作能匡助你皆备清爽日记模块的使用,在神情中对日记的欺诈鸿章钜字。上一篇还没看的漠视先阅读上一篇

网页加载问题 1、为什么子记载器不需要成立日记等第也不错输出?

要是未在记载器上显式成立级别,则使用其父记载器的级别当作其有用级别。要是父记载器也莫得成立级别,则以此类推,搜索父级的父级,直到找到明确成立了级别的记载器。根记载器默许下为 WARNING 级别

import 幸运快艇色碟logging  parent = logging.getLogger("parent") parent.setLevel(logging.INFO) parent.addHandler(logging.StreamHandler())  child = logging.getLogger("parent.child") child.info("msg") 

输出

破产
msg 

这里我莫得给child成立日记等第,他会从父记载器查找日记级别,是以child也不错输出info级别的日记。对于记载器的袭取关系不错参考第一篇著作

当红明星XXX最近社交媒体发布一张健身房锻炼照片,展现超凡体魄热情。 2、为什么巧合候日记会输出两次?

看底下例子:

import logging  # 开动化日记,并成立日记级别(为root成立为DEBUG级别,关联StreamHandler,成立BASIC_FORMAT式样) logging.basicConfig(level=logging.DEBUG)  # 界说root记载器 root = logging.getLogger()  # 界说child记载器 child = logging.getLogger("child") console_handler = logging.StreamHandler() # 给child绑定贬责器 child.addHandler(console_handler) # 记载一条info日记 child.info("child info") 

输出

child info INFO:child:child info 

代码中明明只记载了一次日记,却输出了两次,何况两次的日记式样不相同。这是因为 child 这个记载器添加了一个叫console_handler的贬责器, 而root根记载器默许也带有我方的贬责器(亦然StreamHandler实例)

print(root.handlers) # [<StreamHandler <stderr> (NOTSET)>] 

笔据python中日记模块的贬责机制,子记载器记载的音信会自动传播给父级记载器的关联的贬责器。是以在这个例子中,child记载的音信除了会发给我方的handler外,依然传播给root记载器的handler,因此最终输出了两次,经由图如下

赌球独赢

logging-flow.png

民兵队员在裁判员监督下进行轻武器分解结合。肖承槟摄

7月中旬,一则消息在网上不胫而走:以“保护国家安全”为由,美国国会部分议员打算限制美国政府和军方的航空器发布实时飞行数据。对依靠开源情报跟踪美军战机部署、关注焦点人物动向的民间爱好者来说,这条消息无异于浇在头上的一盆冷水。

要是不但愿子记载器记载的音信传播给父级记载器,不错成立记载器的属性propagate为False,关闭传播。

child.propagate = False 

如斯一来,最终输出到末端的日记就独一child我方的贬责器输出的记载

赌博网站排行ag娱乐是哪个公司的 a17aaa
child info 

配置贬责器的最好实践是给顶级记载器配置贬责器,再笔据需要创建子记载器, 因为记载最终都会传播给父记载器

import logging  parent = logging.getLogger("parent") parent.setLevel(logging.DEBUG) parent.addHandler(logging.StreamHandler())  # 不需要给子记载器单独配置handler child = logging.getLogger("parent.child") child.info("msg") 

对于日记的经由贬责,python官方文档画了一张更为精细的经由图,不错参考

皇冠客服飞机:@seo3687

logging_flow.png

第一次看猜度有点晕,但先看我画的这张图再来看这张图,你就能懂了,为了简化我省去了过滤器以及不停轮回查找父级记载器的这个经由。

3、 为什么我的pycharm中输出的日记是红色?

不知谈你的pycharm输出的日记非论是info信息依然error信息,皇冠官网归正都是红色,一看认为整屏都是失实。

重庆时时彩龙虎斗

把底下代码放在Pycharm运行看恶果:

欧博注册
import logging logging.basicConfig(level=logging.DEBUG) logging.info("hello") 

这是因为使用root记载器记载日记时,默出嫁置的handler是一个StreamHandler。

咱们绽开StreamHandler的源码

class StreamHandler(Handler):     """     A handler class which writes logging records, appropriately formatted,     to a stream. Note that this class does not close the stream, as     sys.stdout or sys.stderr may be used.     """      terminator = '\n'      def __init__(self, stream=None):         """         Initialize the handler.          If stream is not specified, sys.stderr is used.         """         Handler.__init__(self)         if stream is None:             stream = sys.stderr         self.stream = stream 

开动化这个Handler时,会采纳一个stream的参数,要是不传,默许就使用的系统圭臬失实流(sys.stderr)输出,pycharm对失实流输出的字体形式作念了红色渲染,要是换成 sys.stdout 输出的就不再红色了。

import logging import sys  handler = logging.StreamHandler(stream=sys.stdout) logging.basicConfig(level=logging.DEBUG, handlers=[handler])  # 粗心指定stream参数 # logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)  logging.info("hello") 
4、如何生成以日历技巧定名的日记?

实质应用中,咱们会对日记进行存档存储,每天生成一份日记,要是哪天出了问题,也浅薄定位,径直找到今日的日记文献就不错分析。咱们只需要给logger添加一个TimedRotatingFileHandler贬责器就行。

file_handler = TimedRotatingFileHandler(‘'logs/api.log'),                                             when="D", interval=1, backupCount=10,                                             encoding="UTF-8", delay=False, utc=True) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(formatter) file_handler.setLevel(logging.INFO) logger.addHandler(file_handler) 
5、为什么我日记配置后不顺利?

可能跟次序的加载轨则联系,看个例子

import logging  logger = logging.getLogger() handler = logging.StreamHandler() logger.addHandler(handler) logger.info("hello1")  logger.setLevel(logging.INFO) logger.info("hello2") 

像上头的代码临了只输出了hello2,不外实质场景中,代码没这样粗陋,频繁是在a模块中的某个函数中开动化日记框架配置, 在b模块外层创建了名字叫 logger_b的记载器,然后在a中导入b模块时,这时候日记配置还没开动化,临了导致logger_b的配置就成了默出嫁置。是以有可能出现日记不顺利的情况。

 

因此最好实践是能尽早开动化日记配置就尽早提前。