python logging设置_python logging配置时间或大小轮转-程序员宅基地

技术标签: python logging设置  

python中的很多模块是非常牛X的,之前提到过logging模块(其功能类似于java下的Log4j ),由于最近一个涉及网络排障的脚本需要日志输出,这里就使用了python的logging模块去实现。日志全部写到一个文件中时,随着时间的推移文件会越来越来,这里可以利用TimedRotatingFileHandler方法或RotatingFileHandler方法来进行处理。

在日志输出不涉及轮转的时候,可以通过logging.basicConfig 方法自定义输出的日志格式,这部分可以参考我之前的博文记录---python日志模块logging 。在涉及到按日期轮转时,再使用之前的logging.basicConfig格式处理,无法正常输出,这里在咨询之前的python大牛同事后,最终写出的代码内容如下:

#!/usr/bin/env python#coding=utf-8#site: www.361way.com#mail: [email protected]#desc: Rotating logfile by times or size

importreimportsubprocessimportloggingimportsocket,timefrom logging.handlers importTimedRotatingFileHandler

LOG_FILE= "/var/log/ping/ping.log"

#logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %I:%M:%S',filemode='w') #for term print

logger =logging.getLogger()

logger.setLevel(logging.INFO)

fh= TimedRotatingFileHandler(LOG_FILE,when='M',interval=1,backupCount=30)

datefmt= '%Y-%m-%d %H:%M:%S'format_str= '%(asctime)s %(levelname)s %(message)s'

#formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

formatter =logging.Formatter(format_str, datefmt)

fh.setFormatter(formatter)

logger.addHandler(fh)#logging.info(msg)#hdlr.flush()

#----------------------------------------------------------------------

defpinghost(host):

ping= subprocess.Popen(["ping", "-c", "1",host],stdout = subprocess.PIPE,stderr =subprocess.PIPE)

out, error=ping.communicate()if "icmp_seq" inout:

icmp_line= re.findall(r'\d+\sbytes(.*?)ms',out)

logging.info('ping' + host +str(icmp_line))else:

logging.info('ping' + host + 'fail')deftcping(server, port):'''Check if a server accepts connections on a specific TCP port'''

try:

start=time.time()

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((server, port))

s.close()#print server + ':' + str(port) + '/tcp - ' + str(port) + ' port is open' + ' - time=' + str(round((time.time()-start)*10000)/10) + 'ms'

msg = server + ':' + str(port) + '/tcp -' + str(port) + 'port is open' + '- time=' + str((time.time()-start)*1000) + 'ms'logging.info(msg)exceptsocket.error:

msg= server + ':' + str(port) + 'port not open'logging.info(msg)while 1:

pinghost('passport.migu.cn')

pinghost('112.17.9.72')

tcping('passport.migu.cn',8443)

tcping('112.17.9.72',8443)#time.sleep(0.5)

1、轮询函数语法

TimedRotatingFileHandler的构造函数定义如下:

TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

filename 是输出日志文件名的前缀

when 是一个字符串的定义如下:

"S": Seconds"M": Minutes"H": Hours"D": Days"W": Week day (0=Monday)"midnight": Roll over at midnight

interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义的不能因为when而重复。

backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设10,则在文件的创建过程中库会判断是否有超过这个10,若超过,则会从最先创建的开始删除。

2、轮询使用示例

RotatingFileHandler(按照文件大小分割)、TimedRotatingFileHandler(按照时间间隔分割)使用的示例如下

hdlr =logging.handlers.RotatingFileHandler(LOG_FILE,maxBytes=1024*1024,backupCount=40)或

hdlr =logging.handlers.TimedRotatingFileHandler(LOG_FILE,when='M',interval=1,backupCount=40)

其中maxBytes指定每个日志文件的大小,如果文件超过1024比特就分割该日志文件,最大的备份文件个数是40个。到LOG_FILE所在目录下查看,发现除了debug.log文件外,还多了debug.log.1,debug.log.2等文件。

3、logging模块运行流程

logging和handler模块运行的流程如下:

importlogging#创建一个logger

logger = logging.getLogger('mylogger')

logger.setLevel(logging.DEBUG)#创建一个handler,用于写入日志文件

fh = logging.FileHandler('test.log')

fh.setLevel(logging.DEBUG)#再创建一个handler,用于输出到控制台

ch =logging.StreamHandler()

ch.setLevel(logging.DEBUG)#定义handler的输出格式

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

fh.setFormatter(formatter)

ch.setFormatter(formatter)#给logger添加handler

logger.addHandler(fh)

logger.addHandler(ch)#记录一条日志

logger.info('foorbar')

4、logging Level

logger.setLevel方法可以设置日志显示的级别,级别由高至低的顺序是:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL ,如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出 。

5、logging的父子关系

如下图所示,logger日志之间是存在父子关系的。 root logger就是处于最顶层的logger 。

如果不创建logger实例, 直接调用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()这些函数,那么使用的logger就是 root logger, 它可以自动创建,也是单实例的。通过logging.getLogger()或者logging.getLogger("")得到root logger实例。root logger默认的level是logging.WARNING 。

logger的name的命名方式可以表示logger之间的父子关系. 比如:

parent_logger =logging.getLogger('foo')

child_logger =logging.getLogger('foo.bar')

effective level:logger有一个概念,叫effective level。 如果一个logger没有显示地设置level,那么它就用父亲的level。如果父亲也没有显示地设置level, 就用父亲的父亲的level,以此推最后到达root logger,一定设置过level。默认为logging.WARNING child loggers得到消息后,既把消息分发给它的handler处理,也会传递给所有祖先logger处理,

父子测试代码如下:

importlogging#设置root logger

r =logging.getLogger()

ch=logging.StreamHandler()

ch.setLevel(logging.DEBUG)

formatter= logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

ch.setFormatter(formatter)

r.addHandler(ch)#创建一个logger作为父亲

p = logging.getLogger('foo')

p.setLevel(logging.DEBUG)

ch=logging.StreamHandler()

ch.setLevel(logging.DEBUG)

formatter= logging.Formatter('%(asctime)s - %(message)s')

ch.setFormatter(formatter)

p.addHandler(ch)#创建一个子logger

c = logging.getLogger('foo.bar')

c.debug('foo')

输出如下:

2016-03-10 21:04:29,893 - foo

2016-03-10 21:04:29,893 - DEBUG - foo

子logger没有任何handler,所以对消息不做处理。但是它把消息转发给了它的父logger以及root logger。最后输出两条日志。

6、其他

根据在网上看到信息,该模块在多进程环境下使用可能会出现Windows Error 32 报错的情况,这需要重写下 doRollover 函数。

另外涉及到logging模块的配置部分,我们还可以通过指定一个配置文件---使用logging.config.fileConfig('logging.conf')方法,读取该自定义配置的方法生效,具体可以参看官方相关文档。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39625872/article/details/112930789

智能推荐

【DL小结4】seq2seq与attention机制_seq2seq模型是以编码(encode)和解码(decode)为代表的架构方式,seq2seq模型-程序员宅基地

文章浏览阅读1.1k次。seq2seq概述seq2seq模型是以编码(Encode)和解码(Decode)为代表的架构方式,顾名思义是根据输入序列X来生成输出序列Y。encode意思是将输入序列转化成一个固定长度的向量(语义向量,context vector),decode意思是将语义向量解码成输出序列。编码阶段纯粹的RNN/LSTM/GRU解码阶段由上图可以发现Seq2seq中Decoder的公式和..._seq2seq模型是以编码(encode)和解码(decode)为代表的架构方式,seq2seq模型是根据

智能合约最佳实践 之 Solidity 编码规范_智能合约代码规范-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏4次。每一门语言都有其相应的编码规范, Solidity 也一样, 下面官方推荐的规范及我的总结,供大家参考,希望可以帮助大家写出更好规范的智能合约。命名规范避免使用小写的l,大写的I,大写的O 应该避免在命名中单独出现,因为很容易产生混淆。合约、库、事件、枚举及结构体命名合约、库、事件及结构体命名应该使用单词首字母大写的方式,这个方式也称为:帕斯卡命名法或大驼峰式命名法..._智能合约代码规范

2021-06-21 VC++ 6.0安装_bv1yb411t7e8-程序员宅基地

文章浏览阅读1.1k次。2021-06-21 VC++ 6.0安装前言本次实验所用设备为微软surface pro4,操作系统为windows10。注意事项(1)前端编程注意HTML语言的灵活运用以及javascript语言的使用。(2)所要使用图片自己上网寻找替换即可。(3)由于涉及隐私问题,所以代码实现效果图没有全部放出来。(4)本文章主要用于大家学习参考,博客中代码按照步骤来即可执行使用,但请不要商用。。(5)本次安装参照B站视频完成,视频网址如下:https://www.bilibili.com/vi._bv1yb411t7e8

看这一篇就够了!-Ajax详解_ajax解析-程序员宅基地

文章浏览阅读10w+次,点赞1.5k次,收藏7.4k次。今天来聊一聊前后端交互的重要工具Ajax结合上次跟大家分享的前后端交互基础,如果还没有看过的童鞋,以下是传送门前后端交互详解AJAX- 到底什么是Ajax?ajax 全名 async javascript and XML是前后台交互的能⼒也就是我们`客户端给服务端发送消息的⼯具,以及接受响应的⼯具是⼀个 默认异步执⾏机制的功能AJAX分为同步(async = false..._ajax解析

浅谈“三层结构”原理与用意_三层 all-程序员宅基地

文章浏览阅读4.7k次。序在刚刚步入“多层结构”Web应用程序开发的时候,我阅读过几篇关于“asp.net三层结构开发”的文章。但其多半都是对PetShop3.0和Duwamish7的局部剖析或者是学习笔记。对“三层结构”通体分析的学术文章几乎没有。2005年2月11日,Bincess BBS彬月论坛开始试运行。不久之后,我写了一篇题目为《浅谈“三层结构”原理与用意》的文章。旧版文章以彬月论坛程序中的部分代码举例_三层 all

2017年寒假集训分组测试赛2 Ranklist_返回比赛列表 普及组1 - day02 寒假集训 题目列表 比赛成绩表 c. 繁衍 杜俊萱 #c.-程序员宅基地

文章浏览阅读401次。初级二十四点游戏Time Limit: 1000MS Memory Limit: 65536KBSubmit StatisticProblem Description受李老师的影响,他4岁的孩子明明也开始喜欢传统的二十四点游戏了。不过,李老师觉得孩子太小,传统的二十四点的游戏太难了。于是,他把游戏作了简化:给明明两张牌,只能用一次加法或一次乘法运算,看看明明能不能算_返回比赛列表 普及组1 - day02 寒假集训 题目列表 比赛成绩表 c. 繁衍 杜俊萱 #c.

随便推点

编译器_cx51 编译原理-程序员宅基地

文章浏览阅读64次。编译器不是全智能的,有些错误不会立刻呈现1:编译错误,语法问题2:运行时出错,异常,崩溃,运行出错提示不在出错代码时,在之后。_cx51 编译原理

图解 SpringCloud 微服务架构,写的太好了!-程序员宅基地

文章浏览阅读158次。????这是一个或许对你有用的社群????一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事中“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许..._springboot spring cloud nacos 微服务架构图

keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore_keytool 错误: java.lang.exception: 密钥库文件不存在: jone.ke-程序员宅基地

文章浏览阅读8.9k次,点赞3次,收藏6次。keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore通过Android Studio编译器获取SHA1第一步、打开Android Studio的Terminal工具第二步、输入命令:keytool -v -list -keystore keystore文件路径,然后提示keytool 错误: java.lang.Exception:..._keytool 错误: java.lang.exception: 密钥库文件不存在: jone.keystore java.lang

使用conda命令出现:The environment is inconsistent, please check the package plan carefully解决办法-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏8次。使用conda命令时出现下面报错只需要两条命令即可解决一.查询之前的更新版本,然后选择一个之前的版本(出现问题之前)conda list -r二.输入下面命令回滚到之前没出错的版本conda install --revision 版本数字例如输入conda install --revision 143..._the environment is inconsistent

[附源码]Python计算机毕业设计SSM健身俱乐部管理系统(程序+LW)_基于python的健身管理系统-程序员宅基地

文章浏览阅读507次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;_基于python的健身管理系统

Github Desktop1:git的优点和github desktop的简单使用_githubdesktop-程序员宅基地

文章浏览阅读4.4k次,点赞4次,收藏15次。多人合作一个项目,一定要把代码放到一个地方,并随时同步自己本地的和公共的代码。我们也曾这么做,租用一台服务器,修改完本地的代码就复制到服务器上,而开始编写前把服务器上的复制到本地。然而这样做有以下缺点:1.麻烦。就算用ftp软件同步文件,选择文件并复制也很繁琐。2.缺乏更新信息的交流。对代码进行修改,却不说明这次修改了哪些部分,没有更新日志,这将造成开发者对项目的严重误读,而传统的更新日志方..._githubdesktop