python接口自动化(三十九)- logger 日志 - 上(超详解)
<h1>简介</h1><p data-line="3"> Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。</p>
<p data-line="5"> logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供logger,handler,filter,formatter。</p>
<ul class="list-paddingleft-2">
<li>
<p data-line="7">logger<br>提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。</p>
</li>
<li>
<p data-line="10">handler<br>将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。</p>
</li>
<li>
<p data-line="13">filter<br>提供一种优雅的方式决定一个日志记录是否发送到handler。</p>
</li>
<li>
<p data-line="16">formatter<br>指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。</p>
</li>
</ul>
<p data-line="19"> 与log4j类似,logger,handler和日志消息的调用可以有具体的日志级别(Level),只有在日志消息的级别大于logger和handler的级别。</p>
<p>logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:</p>
<ol>
<li>可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;</li>
<li>print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出</li>
</ol>
<h1 id="logging模块使用">logging模块使用</h1>
<h2 id="基本使用">1 基本使用</h2>
<p>配置logging基本的设置,然后在控制台输出日志:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163226547-116042738.png" alt=""></p>
<p>运行时,控制台输出:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163243873-1698370026.png" alt=""></p>
<p>logging中可以选择很多消息级别,如debug、info、warning、error以及critical。通过赋予logger或者handler不同的级别,开发者就可以只输出错误信息到特定的记录文件,或者在调试时只记录调试信息。</p>
<p>例如,我们将logger的级别改为DEBUG,再观察一下输出结果:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163334355-319210850.png" alt=""></p>
<p>控制台输出,可以发现,输出了debug的信息:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163357967-1582334671.png" alt=""></p>
<p>logging.basicConfig函数各参数:</p>
<p>filename:指定日志文件名;</p>
<p>filemode:和file函数意义相同,指定日志文件的打开模式,'w'或者'a';</p>
<p>format:指定输出的格式和内容,format可以输出很多有用的信息,</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">参数:作用
</span>%<span style="color: rgba(0, 0, 0, 1)">(levelno)s:打印日志级别的数值
</span>%<span style="color: rgba(0, 0, 0, 1)">(levelname)s:打印日志级别的名称
</span>%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]
</span>%<span style="color: rgba(0, 0, 0, 1)">(filename)s:打印当前执行程序名
</span>%<span style="color: rgba(0, 0, 0, 1)">(funcName)s:打印日志的当前函数
</span>%<span style="color: rgba(0, 0, 0, 1)">(lineno)d:打印日志的当前行号
</span>%<span style="color: rgba(0, 0, 0, 1)">(asctime)s:打印日志的时间
</span>%<span style="color: rgba(0, 0, 0, 1)">(thread)d:打印线程ID
</span>%<span style="color: rgba(0, 0, 0, 1)">(threadName)s:打印线程名称
</span>%<span style="color: rgba(0, 0, 0, 1)">(process)d:打印进程ID
</span>%(message)s:打印日志信息</pre>
</div>
<p>datefmt:指定时间格式,同time.strftime();</p>
<p>level:设置日志级别,默认为logging.WARNNING;</p>
<p>stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略;</p>
<h2 id="将日志写入到文件">2 将日志写入到文件</h2>
<p><strong>2.1 将日志写入到文件</strong></p>
<p>设置logging,创建一个FileHandler,并对输出消息的格式进行设置,将其添加到logger,然后将日志写入到指定的文件中:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163612984-46794816.png" alt=""></p>
<p>log.txt中日志数据为:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163636039-1336132393.png" alt=""></p>
<p><strong>2.2 将日志同时输出到屏幕和日志文件</strong></p>
<p>logger中添加StreamHandler,可以将日志输出到屏幕上:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163756741-1913210288.png" alt=""></p>
<p>可以在log.txt文件和控制台中看到:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523163924184-136454992.png" alt=""></p>
<p>可以发现,logging有一个日志处理的主对象,其他处理方式都是通过addHandler添加进去,logging中包含的handler主要有如下几种:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">handler名称:位置;作用
StreamHandler:logging.StreamHandler;日志输出到流,可以是sys.stderr,sys.stdout或者文件
FileHandler:logging.FileHandler;日志输出到文件
BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日志回滚方式
RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚
TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件
SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP</span>/<span style="color: rgba(0, 0, 0, 1)">IP sockets
DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets
SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址
SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog
NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT</span>/<span style="color: rgba(128, 0, 128, 1)">2000</span>/<span style="color: rgba(0, 0, 0, 1)">XP的事件日志
MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer
HTTPHandler:logging.handlers.HTTPHandler;通过</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">"</span>或者<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">"</span>远程输出到HTTP服务器</pre>
</div>
<p><strong>2.3 日志回滚</strong></p>
<p>其实意思就是log会写在一个文件,这个文件定义成1K大小,日志太多写不下的话,它会自动备份成log.txt.1,log.txt.2 ......,然后再创建一个log.txt开始写log。使用RotatingFileHandler,可以实现日志回滚:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523164831868-922821136.png" alt=""></p>
<p>可以在工程目录中看到,备份的日志文件:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523164859502-1243120788.png" alt=""></p>
<h2 id="设置消息的等级">3 设置消息的等级</h2>
<p>可以设置不同的日志等级,用于控制日志的输出:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">日志等级:使用范围
FATAL:致命错误
CRITICAL:特别糟糕的事情,如内存耗尽、磁盘空间为空,一般很少使用
ERROR:发生错误时,如IO操作失败或者连接问题
WARNING:发生很重要的事件,但是并不是错误时,如用户登录密码错误
INFO:处理请求或者状态变化等日常事务
DEBUG:调试过程中使用DEBUG等级,如算法中每个循环的中间状态</span></pre>
</div>
<h2 id="捕获traceback">4 捕获traceback</h2>
<p>Python中的traceback模块被用于跟踪异常返回信息,可以在logging中记录下traceback。</p>
<p>代码如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523165055695-1632324263.png" alt=""></p>
<p>控制台和日志文件log.txt中输出:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523165236662-1697593011.png" alt=""></p>
<p>也可以使用logger.exception(msg,_args),它等价于logger.error(msg,exc_info = True,_args),所以你可以将</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> logger.error(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Faild to open sklearn.txt from logger.error</span><span style="color: rgba(128, 0, 0, 1)">"</span>,exc_info = True)</pre>
</div>
<p>替换为:</p>
<div class="cnblogs_code">
<pre>logger.exception(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Failed to open sklearn.txt from logger.exception</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p>控制台和日志文件log.txt中输出:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201905/1232840-20190523165410285-129905082.png" alt=""></p>
<h1 id="多模块使用logging"> 小结</h1>
<p> 嘿嘿,又完成了一篇,下一篇给小伙伴们介绍一下,有关通过JSON或者YAML文件配置logging模块、多模块使用logging和自己封装一个日志类!!!</p>
</div>
<div id="MySignature" role="contentinfo">
<div id="MySignature" style="display: block">
<div style="font-size: 13px; border: 1px dashed rgb(45, 161, 45); padding: 10px 15px; background-color: rgb(248, 248, 248)">
<label style="font-weight: bold">
为了方便大家在移动端也能看到我分享的博文,现已注册个人微信公众号,扫描左下方二维码即可,欢迎大家关注,提前解锁更多测试干货!有时间会及时分享相关技术博文。
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,刚刚建立了咱们的专门的微信群交流互动群,群内会分享交流测试领域前沿知识。请您扫描中间的微信二维码进群
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,现已组建专门的微信群,由于微信群满100,请您扫描右下方宏哥个人微信二维码拉你进群
<label style="font-weight: bold; color: red; font-size: 15px">
(请务必备注:已关注公众号进群)平时上班忙(和你一样),所以加好友不及时,请稍安勿躁~
</label>
,欢迎大家加入这个大家庭,我们一起畅游知识的海洋。
</label>
<br>
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
<br>
如果您觉得阅读本文对您有帮助,请点一下左下角
“推荐”
按钮,您的
<label style="font-weight: bold; color: red; font-size: 15px">
“推荐”
</label>
将是我最大的写作动力!另外您也可以选择
【
<strong>
关注我
</strong>
】
,可以很方便找到我!
<br>
本文版权归作者和博客园共有,来源网址:
https://www.cnblogs.com/du-hong
欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
</div>
<div style="text-align: center; margin-top: 10px">
<p style=" font-weight: bolder; color: red; ">
公众号(关注宏哥)     
        
       
       
微信群(扫码进群)    
       
       
    
      
      客服微信
</p>
<img style="width: 200px;padding-right: 50px;" alt="个人微信公众号" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191119095948011-608816619.png">
<img style="width: 200px;padding-right: 65px;" alt="微信群" src="https://img2024.cnblogs.com/blog/1232840/202506/1232840-20250610113707419-637869921.png">
<img style="width: 200px" alt="个人微信" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191106101257091-849954564.png">
</div>
</div><br><br>
来源:https://www.cnblogs.com/du-hong/p/10912692.html
頁:
[1]