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: itybku@139.com # desc: Rotating logfile by times or sizeimport re import subprocess import logging import socket,time from logging.handlers import TimedRotatingFileHandlerLOG_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()#---------------------------------------------------------------------- def pinghost(host):ping = subprocess.Popen(["ping", "-c", "1",host],stdout = subprocess.PIPE,stderr = subprocess.PIPE)out, error = ping.communicate()if "icmp_seq" in out:icmp_line = re.findall(r'\d+\sbytes(.*?)ms',out)logging.info('ping ' + host + str(icmp_line))else:logging.info('ping ' + host + ' fail')def tcping(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)except socket.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)
代码已上传到我的github上。
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模块运行的流程如下:
import logging # 创建一个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处理,
父子测试代码如下:
import logging # 设置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')方法,读取该自定义配置的方法生效,具体可以参看官方相关文档。
转载于:https://www.cnblogs.com/linkenpark/p/10289118.html
python logging配置时间或大小轮转相关推荐
- Python 获取当前时间或当前时间戳,通过时间戳获取hash
源码: #!/usr/bin/python3import time# 格式化成2016-03-20 11:45:39形式 print (time.strftime("%Y-%m-%d %H: ...
- 使用python logging的配置
使用python logging的配置 简介 在python中使用logging模块,对log进行配置时,可以使用配置文件,而不用再python源码中进行配置. 这样方便更改logging的配置. 使 ...
- Python logging模块切分和轮转日志
Python logging模块切分和轮转日志 logging 模块可以实现日志的输出和写入文件,但实际工作中,对于日志是使用不仅限于输出那么简单. logging基本使用参考:https://blo ...
- python logging模块使用教程
格式化配置: logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(filename)s [%(lin ...
- python logging模块-写日志、log回滚
python包/模块,专栏总目录: 1.python自定义模块 2.python模块调用顺序 3.python logging模块 4.python定义跨模块的全局变量 1.logging模块简介 l ...
- Python LOGGING使用方法
Python LOGGING使用方法 1. 简介 使用场景 场景 适合使用的方法 在终端输出程序或脚本的使用方法 print 报告一个事件的发生(例如状态的修改) logging.info()或log ...
- python logging模块使用
python logging模块使用 logging模块 日志记录的重要性 在开发过程中,我们可以printf或者Debug来排查问题. 但是在生产环境中(黑盒环境)出现问题,我们并不能知道在运行的环 ...
- Python logging使用
Python logging使用 快速配置 # -*- coding:utf-8 -*- import logging# 默认配置root logger logging.basicConfig(fil ...
- Python + logging 输出到屏幕,将log日志写入文件(亲测)
日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事件.事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次出现都潜在地不同的数 ...
最新文章
- 根据坐标如何标记图片_如何玩转FloodFill算法?
- 【小白学PyTorch】4.构建模型三要素与权重初始化
- 大神开车的标题-python中类方法、类实例方法、静态方法的使用与区别
- 实验吧--web--天下武功唯快不破
- STM32 HAL库详解 及 手动移植
- opencv各版本 IplImage Mat 转换
- 【Android 插件化】插件化框架整理
- MSG结构体和WndProc窗口过程详解
- leetcode377. 组合总和 Ⅳ
- C语言标识符、关键字和注释
- 浏览器兼容问题及解决方案
- 我心目中的牛程序员、我们可以对比看看(人家还是看多年朋友面子上才肯帮忙1周,至少需支付1万元辛苦费)...
- 【BZOJ4837】LRU算法 [模拟]
- RTT distribution of Internet
- mysql自助完成翻页代码_MySql实现翻页查询功能
- 引用阿里图标库(iconFont)的三种方式
- 兄弟无线打印显示服务器内部错误,兄弟打印机故障代码表
- modelica学习
- 【第1课 项目愿景】PMP敏捷精讲第五章:项目立项 1/4-科科过PMP
- 嵌入式系统开发笔记16:CJ/T-188 冷热量表协议解析5
热门文章
- css实现简单的电影院选座功能
- 我的ElasticSearch认证工程师之路
- 如何用U盘启动做系统启动盘,如何重装系统
- Hash表_拉链法_开放寻址法_模拟散列表
- excel文字显示图标集_创建自己的Excel图标集
- Android studio的ADBWifi使用
- 魔法少女小圆计算机音乐,求魔法少女小圆一些背景音乐的名字
- 【每日蓝桥】14、一三年省赛Java组真题“三部排序”
- 详解自监督发展趋势! 何恺明连获三年CVPR最高引用的秘诀是?
- 腾讯地图只显示某一区域,覆盖图,marker自定义图标和文本标注