python封装模块_Python练手,封装日志模块,v2

前面第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 |··|··|··牛逼镇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发现了拯救“文献多的一团麻”的工具

Endnotes是一款好的文献管理工具; 可用以收集文献;整理在引用文献时的不知所踪(提前在reference中细化标题);还有一些在阅读文献时 转瞬即逝的灵感(notes); 使用笔记来自:感谢其悉心编写。 http://blog.sciencenet.cn/blog-484734-367968.htm…

windows安装apache

1打开apache官网http://httpd.apache.org/ 下载win版本 2解压放入D盘D:\Apache24 3修改http.conf,安装路径 端口改成8080,避免占用,原先是80 4http -t检查配置文件合法 5httpd -k install -n apache安装主服务 6net start apache

java语言中的标识符_Java语言基本语法(一)————关键字标识符(Java语言标识符命名规范Java语言的包名、类名、接口名、变量名、函数名、常量名命名规则 )...

一、关键字关键字的定义和特点定义:被Java语言赋予特殊含义,用做专门用途的字符串(单词)。特点:关键字中所有字母均为小写下面列举一些常用的关键字。用于定义数据类型的关键字:byte、short、int、long、float、double、char、boo…

数组的合并和升序排列_leetcode No.31 下一个排列

题目链接:下一个排列 - 力扣(LeetCode)​leetcode-cn.com题目描述:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成…

公司网络故障那些事(路由器变交换机)

首先这次网络故障是断电引起的 我给大家画个模型 三层的为八口交换机 一层的为五口打印机 笔记本代表两台无线打印机 首先八口的连接了公司采购电脑一台,业务电脑一台,其他电脑三台 第二个五口交换的连接财务电脑两台 最后一个五口交换机连接两台无线打印…

【原创】大公司为什么还在采用过时的技术

背景 本文出自一朋友给我的提问,于是博主呕心沥血给他花式洗脑了几个小时。忽然发现,应该还有许多朋友有同样的疑问。所以整理成文。 许多刚毕业的程序员朋友,都有一个执念,想要进那种规模大一点的公司、上市的、业内有名的最好。…

java 文件上传 配置_SpringMVCMultipartFilefile文件上传及参数接收

一、form表单属性中加上enctype"multipart/form-data"form表单的二、配置文件中配置MultipartResolver文件超出限制会在进入controller前抛出异常,在允许范围内这个配置无影响三、MultipartFile接受文件并通过IO二进制流(MultipartFile.getInputStream())…

list foreach方法_Java集合三兄弟List,Set,Map你分的清楚吗?

前言集合作为Java基础知识的核心部分,不论是在面试还是平时工作中都是经常遇见的。当然面对熟悉的List、Set、Map,面试管的提问一般也都不会从简单的问题出发了,今天就来聊下集合中的高级部分,让你对它们的理解更加清楚。一、List…

centos7.3防火墙配置

Centos7.3防火墙配置 1、查看firewall服务状态 systemctl status firewalld 2、查看firewall的状态 firewall-cmd --state 3、开启、重启、关闭、firewalld.service服务 开启 service firewalld start 重启 service firewalld restart 关闭 service firewalld stop 4、…

SpringBoot使用Jsp

本文是简单总结一下SpringBoot使用Jsp的Demo。 前言 在早期做项目的时候,JSP是我们经常使用的java服务器页面,其实就是一个简化servlet的设计,在本文开始之前,回顾一下jsp的几大对象,如图。 而在现在SpringBoot框架流行…

java 持久_Java持久锁总结 -解道Jdon

并发主题Java与持久相关的锁总结本文总结Java中有关数据库保存持久数据的锁机制,不只是纯粹数据库自身的锁,本文主要就Java持久层三个技术数据库、JPA和Hibernate的锁应用进行了总结。在并发理论中,锁是用于保护可变的共享数据,以…

cacti 监控安装失败

1首先这是基于lnmp模式进行的 2yum安装 yum -y install httpd mysql mysql-server php php-mysql php-json php-pdo 3lib库 yum -y install cairo-devel libxml2-devel pango pango-devel 4 解压rrdtool-1.3.1.tar.gz Cd rrdtool-1.3.1 ./configure --prefix/usr/local/rrdtoo…

project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...

施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图作为施工组织设计的关键内容,施工进度计划控制了工程施工进度、工程施工期限等各项施工活动。进度计划是否合理,直接影响施工速度、成本和质量。因此施工中的其他工作必…

JavaScript学习系列3 -- JavaScript arguments对象学习

在实际项目开发中,目前还是很少使用到JavaScript 中的arguments对象,那么它到底是干什么用的呢 arguments是JavaScript中的一个类数组对象,它代表传给一个正在执行的函数function的参数列表。 看完这个定义,需要明白&#xff0c…

二叉树垂直遍历 java_【004】二叉树垂直遍历

二叉树垂直遍历题目描述输入输出示例输入实例输出DFSBFS更简单的方法二叉树垂直遍历题目描述对于一个二叉树,输出它的垂直遍历结果;对于同一列的节点,按照从左向右,从上向下的顺序排列。例如,对于以下二叉树&#xff1…

matlab二元一次方程求解_2-函数的求解计算

一、本期介绍函数的求解有两种(1)已知x求y(2)已知y求x1.1已知x求y回想我们上一期,讲了多项式求解的方法,也是已知x求y。想一下,多项式不也是函数的一种吗,所以本期求解的方法同样适用…

linux lnmp yum版安装

LAMP(linux、apache、mysql、php),是四个套件的合成,简单讲就是要把php运行在linux上,需要依赖apache和mysql数据库。 1 准备好一个linux系统(centos7)   确保selinux、firewall已经关闭   …

面向对象的四大特征

面向对象的四大特征 面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。 面向对象程序设计,是通过为数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法。对象是计算机内存中的一块区域&#xff0…

python装饰器调用顺序_聊一聊Python装饰器的代码执行顺序

为什么写这篇文章?起因是QQ群里边有人提了一个问题:之前导入模块只需要1~2秒,为什么现在变成需要2~3分钟?我的第一感觉是:是不是导入的模块顶层代码里边,做了什么耗时的事情。隔了一天,他的问题…

centos7 安装cacti

1 cacti运行环境准备   cacti需要phpapachemysqlsnmpRRDTool,以及cacti本身。cacti本体是用php开发的网站,通过snmp对远端设备信息进行采集。apachemysqlphp在以前已经做过了      这里只对剩余的部分进行安装。 2 安装snmp    yum install -y n…