python的日志模块

系统 1902 0
            
              '''
date:2019-06-28
autor:wangxc
功能:
1.写日志功能,当没有传入日志写入路径时,他会将 本文件名.log 的日志文件存放到脚本同路径下
    例子:脚本路径在c:logger.py,那么生成的日志文件logger.log将会在c:下存在
2.可以传入日志的级别,控制日志输出的形式,如何配置日志输出形式,可以看下面注释
'''

import logging
import os,sys
from logging.handlers import RotatingFileHandler

'''
%(name)s  Logger的名字
%(levelno)s  数字形式的日志级别
%(levelname)s  文本形式的日志级别
%(pathname)s  调用日志输出函数的模块的完整路径名,可能没有
%(filename)s  调用日志输出函数的模块的文件名
%(module)s  调用日志输出函数的模块名
%(funcName)s  调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s  字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s  线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s  用户输出的消息
'''
#用字典保存日志级别 日志输出的形式
format_dict = {
   1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(levelno)s - %(pathname)s - %(filename)s - %(module)s - %(funcName)s - %(lineno)d - %(thread)d - %(threadName)s - %(process)d'),
   2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}

# 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件
class Logger():
    def __init__(self, logname, loglevel, logger="logger"):
        path = os.path.split(sys.argv[0])[0]
        filename = os.path.split(sys.argv[0])[-1]
        log_file = filename.split(".")[0] + ".log"
        #日志输出具体路径
        log_path = os.sep.join([path,log_file])

        # 创建一个logger
        self.logger = logging.getLogger(logger)
        #设置日志打印的级别
        #如果设置成ERROR,则只会打印ERROR日志信息
        #如果设置成INFO,则会打印出INFO和ERROR的日志信息
        #如果设置成DEBUG,则会打印ERROR,INFO和ERROR的日志信息
        self.logger.setLevel(logging.DEBUG)

        #判断日志路径,不存在创建
        if not os.path.exists(logname):
            os.makedirs(logname)

        # 创建一个handler,用于写入日志文件
        #fh = logging.FileHandler(logname,mode='w',encoding='UTF-8')
        #fh.setLevel(logging.DEBUG)
        # 定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
        fh = RotatingFileHandler(log_path,encoding='UTF-8', maxBytes=1 * 1024 * 1024, backupCount=5)
        #控制输出到日志文件的日志级别
        fh.setLevel(logging.DEBUG)

        # 再创建一个handler,用于输出到控制台
        ch = logging.StreamHandler()
        #控制输出到控制台的日志级别
        ch.setLevel(logging.DEBUG)

        # 定义handler的输出格式
        # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        formatter = format_dict[int(loglevel)]
        #同时在控制台和日志中输出,可以按个人需求修改
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

    def getlog(self):
        return self.logger

if __name__ == '__main__':
    #测试
    logger = Logger(logname='C:/Users/Administrator/Desktop/a/', loglevel=1, logger="ww").getlog()

    i = 0
    while(i<10):
        logger.error('this is error')
        logger.debug('this is debug')
        logger.info('this is info')
        i = i + 1

            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论