【专题】python自定义封装logging

python的logging模块详细介绍:python logging模块

'''
import os
import logging
import logging.handlers as handlers
from datetime import datetime


class logFilter(object):
    def __init__(self, level):
        self.__level = level

    def filter(self, logRecord):
        return logRecord.levelno <= self.__level


class CustomLogging(object):
    def __init__(self, name):
        self.logger = logging.getLogger(name)
        self.logger.parent.setLevel(logging.DEBUG)
        self.logger.root.setLevel(logging.DEBUG)
        # log存放的目录
        self.log_path = os.path.join(
            os.getcwd(), "log", datetime.now().strftime("%Y-%m-%d"))
        # log格式化输出
        self.log_formatter = logging.Formatter(
            '%(asctime)s-%(levelname)s : %(message)s', '%Y-%m-%d %H:%M:%S')
        # 控制台输出
        self.set_console_logger()
        # 文件输出日志
        self.set_file_logger()

    def set_console_logger(self):
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.DEBUG)
        console_handler.setFormatter(self.log_formatter)
        self.logger.addHandler(console_handler)

    def set_file_logger(self):
        log_message_path = os.path.join(self.log_path, "message")
        log_error_path = os.path.join(self.log_path, "error")
        if not os.path.exists(log_message_path):
            os.makedirs(log_message_path)
        if not os.path.exists(log_error_path):
            os.makedirs(log_error_path)
            
        messageHandle = handlers.RotatingFileHandler(os.path.join(log_message_path, "access.log"),
                                                     maxBytes=1024*1024*30, backupCount=50, encoding="utf-8", delay=False)
        messageHandle.setLevel(logging.INFO)
        # messageHandle.addFilter(logFilter(logging.INFO))
        messageHandle.setFormatter(self.log_formatter)
        self.logger.addHandler(messageHandle)

        errorHandle = handlers.RotatingFileHandler(os.path.join(log_error_path, "error.wf.log"),
                                               maxBytes=1024*1024*30, backupCount=50, encoding="utf-8", delay=False)
        errorHandle.setLevel(logging.ERROR)
        # errorHandle.addFilter(logFilter(logging.ERROR))
        errorHandle.setFormatter(self.log_formatter)
        self.logger.addHandler(errorHandle)

    def get_logger(self):
        return self.logger
logger = CustomLogging(__name__).get_logger()

if __name__ == "__main__":
    logger.info("Log Info...")
    logger.error("Log Error...")

		
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonlogging模块可以用来记录程序运行时的日志信息,包括调试信息、警告信息、错误信息等。为了方便使用,可以对logging模块进行封装,使其更容易调用和管理。 以下是一些可能有用的封装方法: 1. 封装基本配置:将logging模块的基本配置封装成一个函数,可以方便地进行调用和修改。例如: ```python import logging def init_logger(log_file): logger = logging.getLogger() logger.setLevel(logging.DEBUG) handler = logging.FileHandler(log_file) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) ``` 这个函数会初始化一个logger对象,并将其级别设置为DEBUG,将日志输出到指定的文件中,并使用指定的格式进行格式化。 2. 封装消息类型:可以定义不同的消息类型,例如debug、info、warning、error等,然后为每种类型都定义一个封装函数,以简化调用。例如: ```python import logging logger = logging.getLogger() def debug(msg): logger.debug(msg) def info(msg): logger.info(msg) def warning(msg): logger.warning(msg) def error(msg): logger.error(msg) ``` 这样,使用时可以直接调用对应的函数,例如: ```python debug('this is a debug message') warning('this is a warning message') ``` 3. 封装上下文信息:有时候需要在日志中添加一些上下文信息,例如当前时间、请求参数、用户ID等。可以定义一个上下文管理器,用with语句来管理上下文信息的输出。例如: ```python import logging logger = logging.getLogger() class LogContext: def __init__(self, **kwargs): self.kwargs = kwargs def __enter__(self): logger.info('start context', extra=self.kwargs) def __exit__(self, exc_type, exc_value, traceback): logger.info('end context', extra=self.kwargs) ``` 使用时可以这样调用: ```python with LogContext(user_id=123): logger.info('do something') ``` 这样会在日志中输出一条包含上下文信息的记录。 总之,封装logging模块可以帮助我们更方便地使用日志功能,提高开发效率和代码可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值