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
        
    def addHandler(self,xHandler):
        self.logger.addHandler(xHandler.handler)
        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://blog.51cto.com/hadoooo/2060241

时间: 2024-07-31 14:02:16

Python练手,封装日志模块,v2的相关文章

Python练手项目:20行爬取全王者全英雄皮肤

引言 ? ?王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. ? ?文中源代码在文章末尾,可自行复制粘贴. 准备工作 ? ?爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: ? ?我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片地址: ? ?接着,我们切换一下英雄的

Python入门之logging日志模块以及多进程日志

本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志记录.python logging 官方文档 logging框架中主要由四个部分组成: Loggers: 可供程序直接调用的接口 Handlers: 决定将日志记录分配至正确的目的地 Filters:

70个Python练手项目

前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目. 70个Python项目列表: 1.[Python 图片转字符画]2.[200行Python代码实现2048]3.[Python3 实现火车票查询工具]4.[高德API+Python解决租房问题 ]5.[Python3 色情图

[Python] iupdatable包:日志模块使用介绍

一.说明 日志模块是对 logging 模块的单例封装 特点: 可同时向控制台和文件输出日志,并可选择关闭其中一种方式的输出: 集成colorlog,实现根据日志等级不同,控制台输出日志颜色不同: 灵活切换是否输出调试内容 二.简单示例 安装 iupdatable 包 pip install --upgrade iupdatable 使用实例: 1 from iupdatable.logging.Logger import Logger 2 from iupdatable.logging.Log

Python练手,封装日志模块,v1

代码:Python3 # -*- coding: utf-8 -*- '''     --封装了logging模块,仅保留关键设置,美化了输出格式 ''' import sys,random,time  import logging as lg def getRandomInt(digits):     '''     @args:          int digits     @returns:          string     '''     return random.randin

【转载】【python】python练手项目

入门篇 1.Python - Python 图片转字符画 50 行 Python 代码完成图片转字符画小工具. 2.Python - 200行Python代码实现2048 仅用200行的python代码完成2048小游戏的编写. 3.Python - pygame开发打飞机游戏 使用Python快速开发一款PC端玩耍的微信打飞机游戏,基于pygame实现. 4. Python 实现简单画板 要利用 Pygame 模块来自己实现一个功能更加简单的画板. 5.Python - 全面解析PythonC

Python练手例子(16)

91.时间函数举例1. #!/usr/bin/python #coding=utf-8 import time if __name__ == '__main__': #time.time()返回当前的时间戳(1970纪元后经过的浮点秒数) print(time.time()) #time.ctime()把时间戳转化为time.asctime()的形式 print(time.ctime(time.time())) #time.asctime()返回"Tue Feb 26 09:12:37 2019

python练手项目

文本操作 逆转字符串--输入一个字符串,将其逆转并输出. 拉丁猪文字游戏--这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如"banana"会变成"anana-bay").可以在维基百科上了解更多内容. 统计元音字母--输入一个字符串,统计处其中元音字母的数量.更复杂点的话统计出每个元音字母的数量. 判断是否为回文--判断用户输入的字符串是否为回文.回文是指正反拼写形式都是一样的词,譬如"racecar

Python自带的日志模块logging的使用

import logging # 创建一个logger logger = logging.getLogger('cmccLogger') logger.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') fh.setLevel(logging.DEBUG) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLeve