前面第1版写好后,很凌乱,主要的问题在于,Python不支持方法重载,想要灵活创建对象,当时的变通办法是,先链式地有选择地设置属性(方法重载的本质就是有选择地设置属性),再做实例化,这样导致后面创建对象的时候就很凌乱。

然后才知道,Python可以缺省参数,变相做到方法重载

代码:Python3# -*- coding: utf-8 -*-

'''

--封装了logging模块,舍弃了繁琐了设置,仅保留关键设置,美化了输出格式

'''

import sys,random,time

import logging as lg

def getRandomInt(digits):

'''

@args:

int digits

@returns:

string

'''

return random.randint(1,10**digits-1).__str__().zfill(digits)

def getNowDate(fmt):

'''

@args:

string fmt

@returns:

string

'''

return time.strftime(fmt,time.localtime()).__str__()

def getOriginPath():

'''

@returns:

string

'''

return sys.argv[0]

class XLogger():

'''

-日志记录器 -封装了logging模块,舍弃了繁琐了设置,仅保留关键设置,美化了输出格式

-大概用法:-创建XLogger,添加XHandler

-对于XLogger

-允许设置日志级别、记录器名称、父子记录器的传播功能

-对于XStreamHandler 控制台输出

-不允许设置

-对于XFileHandler 文件输出

-允许设置文件路径,文件写入方式:覆盖/追加

'''

levelMap = {'DEBUG':lg.DEBUG,

'INFO':lg.INFO,

'WARN':lg.WARNING,

'ERROR':lg.ERROR,

'CRITICAL':lg.CRITICAL}

def __init__(self,name='AUTO',level='INFO',propagate=False):

'''

@args:

String name  记录器名称 (名称可体现记录器的父子关系)

String level 日志级别  DEBUG/INFO/WARN/ERROR/CRITICAL

String propagate 是否开启父子日志记录器的向上传播功能

- 若开启,子记录器会获得父记录器的全部Handler,

- 需注意重复添加Handler以免产生重复日志

'''

self.level     = level

self.propagate = propagate

if name.upper() == 'AUTO' :

self.name = getRandomInt(12)

else:

self.name = name

self.logger = lg.getLogger(self.name)

self.logger.setLevel(XLogger.levelMap.get(self.level))

self.logger.propagate = self.propagate

print('XLogger named: '+self.name)

def addHandler(self,xHandler):

self.logger.addHandler(xHandler.handler)

if isinstance(xHandler,XLogger.XFileHandler):

print('XLogger XFileHandler file: '+xHandler.file)

return self

def debug(self,layer,message):

self.logger.debug('DBUG ' + '|··' * layer +message)

def info(self,layer,message):

self.logger.info('INFO ' + '|··' * layer + message)

def warning(self,layer,message):

self.logger.warning('WARN ' + '|··' * layer + message)

def error(self,layer,message):

self.logger.error('ERRO ' + '|··' * layer + message)

def critical(self,layer,message):

self.logger.critical('CRIT ' + '|··' * layer + message)

class XHandler:

def __init__(self):

self.handler = None

self.formatter = lg.Formatter('[%(name)s] %(asctime)s %(message)s','%y/%m/%d %H:%M:%S')

class XFileHandler(XHandler):

def __init__(self,file='AUTO',model='w'):

'''

@args:

String file 文件路径 若设置为AUTO 则日志文件路径为:起源执行文件.时间+随机数+XLOG

String model 文件写入模式 w覆盖 a追加

'''

XLogger.XHandler.__init__(self)

self.model = model

if file.upper() == 'AUTO' :

self.file = getOriginPath()+'.'+getNowDate("%Y%m%d%H%M%S")+getRandomInt(4)+'XLOG'

else:

self.file = file

self.handler = lg.FileHandler(self.file,mode=self.model.lower(),encoding='UTF-8',delay=False)

self.handler.setFormatter(self.formatter)

class XStreamHandler(XHandler):

def __init__(self):

XLogger.XHandler.__init__(self)

self.handler = lg.StreamHandler()

self.handler.setFormatter(self.formatter)

测试:dir_='D:\\Users\\ex-hexuwen001\\Desktop\\Work\M1-APPS\\using__apps_data\\eclipse_workspace\\myPython\\src'

file1=dir_+'\\1.xlog'

file2=dir_+'\\2.xlog'

logger1 = XLogger(name='aaaa', level='DEBUG', propagate=True)\

.addHandler(XLogger.XFileHandler(file=file1, model='w'))\

.addHandler(XLogger.XStreamHandler())

logger1.debug(0,"牛逼局域网")

logger1.info(1,'广东省')

logger1.warning(2,'肇庆市')

logger1.error(2,'高要市')

logger1.critical(3,'牛逼镇')

logger2 = XLogger(name='aaaa.bbbb', level='DEBUG', propagate=True)\

.addHandler(XLogger.XFileHandler(file=file2, model='w'))\

.addHandler(XLogger.XStreamHandler())

logger2.debug(0,"牛逼局域网")

logger2.info(1,'广东省')

logger2.warning(2,'肇庆市')

logger2.error(2,'高要市')

logger2.critical(3,'牛逼镇')

输出:[aaaa] 18/01/12 14:55:04 DBUG 牛逼局域网

[aaaa] 18/01/12 14:55:04 INFO |··广东省

[aaaa] 18/01/12 14:55:04 WARN |··|··肇庆市

[aaaa] 18/01/12 14:55:04 ERRO |··|··高要市

[aaaa] 18/01/12 14:55:04 CRIT |··|··|··牛逼镇

[aaaa.bbbb] 18/01/12 14:55:04 DBUG 牛逼局域网

[aaaa.bbbb] 18/01/12 14:55:04 DBUG 牛逼局域网

[aaaa.bbbb] 18/01/12 14:55:04 INFO |··广东省

[aaaa.bbbb] 18/01/12 14:55:04 INFO |··广东省

[aaaa.bbbb] 18/01/12 14:55:04 WARN |··|··肇庆市

[aaaa.bbbb] 18/01/12 14:55:04 WARN |··|··肇庆市

[aaaa.bbbb] 18/01/12 14:55:04 ERRO |··|··高要市

[aaaa.bbbb] 18/01/12 14:55:04 ERRO |··|··高要市

[aaaa.bbbb] 18/01/12 14:55:04 CRIT |··|··|··牛逼镇

[aaaa.bbbb] 18/01/12 14:55:04 CRIT |··|··|··牛逼镇

python封装模块_Python练手,封装日志模块,v2相关推荐

  1. python强大的模块_python之强大的日志模块-阿里云开发者社区

    1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...

  2. powerbi python词云图_Python 练手项目: 抓取豆瓣陈情令评论,并制作词云图

    一.项目简介 1.内容:循环抓取豆瓣影评中所有观众对<陈情令>的评论,存储在文本文档中,并运用可视化库--词云对其进行分析. 2.目标网站: https://movie.douban.co ...

  3. python新手项目-推荐:一个适合于Python新手的入门练手项目

    原标题:推荐:一个适合于Python新手的入门练手项目 随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人 ...

  4. 给python初学者的最好练手项目-适合初学者练手的 10 个 有趣Python项目

    Python Python开发 Python语言 适合初学者练手的 10 个 有趣Python项目 想成为一个优秀的开发者,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以 ...

  5. 从入门到入土:Python爬虫学习|实例练手|爬取猫眼榜单|Xpath定位标签爬取|代码

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. 从入门到入土:Python爬虫学习|实例练手|爬取百度翻译|Selenium出击|绕过反爬机制|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. 从入门到入土:Python爬虫学习|实例练手|爬取新浪新闻搜索指定内容|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  8. 从入门到入土:Python爬虫学习|实例练手|爬取百度产品列表|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. python将整数逆序_python练手入门小项目:字符串的妙用

    题目来源:小行:python练手入门小项目详解(一) 1 给任意一个的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. 代码: def reversed_integer(number):ass ...

最新文章

  1. Java 二次MD5 32位小写加密算法与php页面加密结果相同
  2. 从源码开始运行Bitcoin Core
  3. lvs集群基础及lvs-nat、dr、fwm实践
  4. View4.5测试参考文档7--View Administrator安装、配置、创建桌面池
  5. 刷牙刷了这么多年,我们居然都搞错了!
  6. 问题排查:vue项目刷新页面加载了500多个请求?
  7. Solidworks如何自动打开和关闭特征识别FeatureWorks
  8. Airbnb React/JSX 编码规范
  9. Navicat的使用,连表查询,python代码操作sql语句
  10. Android setBackgroundDrawable()过时解决办法
  11. fcntl函数详解-文件锁
  12. 基于java的健康管理平台设计与实现(含源文件)
  13. Catalan Number(卡特兰数/卡塔兰数)
  14. ctfshow (ssrf学习和实践)
  15. 1,vue播放视频之—引入.m3u8后缀的hsl视频流
  16. 【坑2】maven通过nexus私服服务器下载jar包提示无权限Authentication failed for http://localhost:8081/repository/maven-pub
  17. 实战讲述Flutter跨平台框架应用,帮你突破瓶颈
  18. python装饰器哪个好_[Python] 对 Python 装饰器的理解心得
  19. 数据处理之Pandas中数据类型转换
  20. 【Hexo】实现博客的动态说说功能

热门文章

  1. BZOJ-1045 糖果传递
  2. 实现、设置-Android TabWidget-by小雨
  3. CRM软件设计评测点与采集测评点
  4. CERL 2.0 预告:Erlang Style Concurrency + 状态机
  5. android app逆向分析,如何开始对Android应用的逆向分析?
  6. 奇怪的问题,再次启动jar包会导致bean对象失效?Unknown redis exception Cannot connect, Event executor group is terminated
  7. ARCSDE的直接连接(SQLSERVER)
  8. 委外订单_ERP软件教程:金蝶ERP的委外加工业务流程(一)
  9. sqlserver获得到当前游标中存在的数据行数
  10. HTML框架(Frames)