最新Pyhon日志打印方式,可以控制在控制台显示和写入日志文件

本文介绍了一个Python日志模块的实现方法,该模块能够自定义日志级别,并且支持输出到控制台和文件。通过使用RotatingFileHandler,可以实现日志文件按大小分割保存,避免单个日志文件过大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目结构如下

代码如下

主文件logutils.py(附注释)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import logging
import time
import logging.handlers

reload(sys)
sys.setdefaultencoding('utf8')


FOMMATER = '[%(asctime)s](%(levelname)s) {pid:%(process)d, tid:%(thread)d, %(filename)s}, %(module)s.%(funcName)s %(lineno)d: %(message)s\r'
LOG_HOME = '..' + os.sep + 'log' + os.sep
def getLogger(logfile, pscr = False):
    '''
    :logfile 日志输出文件,只输入文件名到默认路径,或直接输入系统的其他绝对路径
    :pscr 是否将日志输出到控制台
    '''
    global LOG_HOME
    # 输入指定的其他目录存放日志时,若绝对路径不存在,抛出IOError异常
    if logfile.find(os.sep) != -1:
        onlydir = os.path.dirname(logfile)
        if not os.path.isdir(onlydir):
            raise IOError("The %s path doesn't exist!" % onlydir)
    else:
        logfile = os.path.join(LOG_HOME, logfile)

    # 判断扩展名是否为log,若不存在需要添加log后缀

    ext = os.path.splitext(logfile)[1]
    if ext != '.log' :
        logpath = ('%s.log' % logfile)
    else:
        logpath = logfile


    ml = ModuleLogger('')
    ml.init(logpath, pscr)
    return ml


class ModuleLogger(logging.Logger):

    def init(self, logpath, pscr):
        global FOMMATER
        self.logpath = logpath
        self.pscr = pscr
        # self.debug_ctl = debug_ctl;



        if(self.pscr):
            # create console handler with a higher log level
            ch = logging.StreamHandler(sys.stdout)
            # ch.setLevel(self.level)


        # create formatter and add it to the handlers
        self.format = logging.Formatter(FOMMATER)
        if(self.pscr):
            ch.setFormatter(self.format)


        # add the handlers to the logger
        if(self.pscr):
            self.addHandler(ch)

        #生成RotatingFileHandler,设置文件大小为10M,编码为utf-8,最大文件个数为30个,如果日志文件超过3,则会覆盖最早的日志
        hdlr_Rotating = logging.handlers.RotatingFileHandler(logpath, mode = 'a', maxBytes = 1024*1024*100, backupCount = 10, encoding = 'utf-8')
        hdlr_Rotating.setFormatter(self.format)
        # hdlr_Rotating.setLevel(level)
        self.addHandler(hdlr_Rotating)

    def config(self,logpath, pscr):
        global FOMMATER
        self.logpath = logpath
        self.pscr = pscr
        # self.debug_ctl = debug_ctl;



        if self.handlers:
            for handler in self.handlers:
                self.removeHandler(handler)


        if(self.pscr):
            # create console handler with a higher log level
            ch = logging.StreamHandler(sys.stdout)
            # ch.setLevel(self.level)


        # create formatter and add it to the handlers
        self.format = logging.Formatter(FOMMATER)
        if(self.pscr):
            ch.setFormatter(self.format)


        # add the handlers to the logger
        if(self.pscr):
            self.addHandler(ch)
        #生成RotatingFileHandler,设置文件大小为10M,编码为utf-8,最大文件个数为30个,如果日志文件超过30,则会覆盖最早的日志
        hdlr_Rotating = logging.handlers.RotatingFileHandler(logpath, mode = 'a', maxBytes = 1024*1024*10, backupCount = 30, encoding = 'utf-8')
        hdlr_Rotating.setFormatter(self.format)
        # hdlr_Rotating.setLevel(level)
        self.addHandler(hdlr_Rotating)


if __name__ == '__main__':
    ''' Usage: from logutils import getLogger '''
    # 日志文件名,控制台可显
    logger = getLogger("logmodule", False)
    try:
        logger.error('ioerror')
        logger.info('output')
        logger.debug('enter proc')
    except Exception, e:
        print str(e)


配置context.py(附注释)
#!coding=utf-8
import os
from utilstools.logutils import getLogger

cur_path = os.path.normpath(os.path.dirname(__file__))
# FAILED_PATH ="D:/log/failed.log"
FAILED_PATH = os.path.dirname(cur_path) + os.sep + "logs/failed.log"
# 日志文件名,控制台可显
logger = getLogger(FAILED_PATH,True)

if __name__ == '__main__':
    try:
        logger.error('ioerror')
        logger.info('output')
        logger.debug('enter proc')
    except Exception, e:
        print str(e)

效果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值