python日志logging封装

方式一:封装代码

import logging, logging.handlers, time, os
class Log(object):
    '''
        logging的初始化操作,以类封装的形式进行
    '''

    def __init__(self):
        # 定义对应的程序模块名name,默认为root
        self.logger = logging.getLogger()
        # 设置输出的等级
        LEVELS = {'NOSET': logging.NOTSET,
                  'DEBUG': logging.DEBUG,
                  'INFO': logging.INFO,
                  'WARNING': logging.WARNING,
                  'ERROR': logging.ERROR,
                  'CRITICAL': logging.CRITICAL}

        # log_path是存放日志的路径
        timestr = time.strftime('%Y_%m_%d', time.localtime(time.time()))
        lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../logs'))
        # 如果不存在这个logs文件夹,就自动创建一个
        if not os.path.exists(lib_path):
            os.mkdir(lib_path)
        # 日志文件的地址
        self.logname = lib_path + '/' + timestr + '.log'

        # 必须设置,这里如果不显示设置,默认过滤掉warning之前的所有级别的信息
        self.logger.setLevel(logging.INFO)

        # 日志输出格式
        self.formatter = logging.Formatter(
            '[%(asctime)s] [%(filename)s] [%(levelname)s]: %(message)s')  # [2019-05-15 14:48:52,947] - test.py] - ERROR: this is error

        # 创建一个FileHandler, 向文件logname输出日志信息
        # fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')
        fh = logging.handlers.RotatingFileHandler(filename=self.logname,
                                                  maxBytes=1024 * 1024 * 50,
                                                  backupCount=5)
        # 设置日志等级
        fh.setLevel(logging.INFO)
        # 设置handler的格式对象
        fh.setFormatter(self.formatter)
        # 将handler增加到logger中
        self.logger.addHandler(fh)

        # 创建一个StreamHandler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.INFO)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)

        # # 关闭打开的文件
        fh.close()

    def info(self, message):
        self.logger.info(message)

    def debug(self, message):
        self.logger.debug(message)

    def warning(self, message):
        self.logger.warning(message)

    def error(self, message):
        self.logger.error(message)

    def critical(self, message):
        self.logger.critical(message)


if __name__ == "__main__":
    logger = Log()
    logger.info("this is info")
    logger.debug("this is debug")
    logger.error("this is error")
    logger.warning("this is warning")
    logger.critical("critical")

方式二:配置文件

#coding: utf-8
#logging配置文件

#定义logger模块,root是父类,必须存在,其他的自定义
#logging.getLogger(name) 相当于向loggging模块注册了一种日志打印
#如果name为loggers里面keys的值,则调用对应的配置,如果name没有则调用默认(root)的配置
#name 中用点 . 表示继承关系
#可以有多个,以逗号隔开
#####################################################################################################
#实现logger对应的配置信息
#            必须是 logger_name  name为loggers中key的值
#level       日志级别,级别有 DEBUG,INFO,WARNING,ERROR,CRITICAL
#handlers    日志处理器,可以有多个 以逗号隔开
#qualname    logger的名称,通过logging.getLogger(name)获取,这里的name便是qualname
#            如果获取的logger 名称不存在,则调用默认(root)logger
#propagate   是否继承符类的配置信息,0:否 1:是
#如果这个属性是True也就是1,那么这个logger的输出会朝着上一级logger传播;会产生两个记录
#所以需要把其他logger的propagate属性设置为False

[loggers]
keys=root,console,file

[logger_root]
level=DEBUG
handlers=rootHandler
formatter=pretty

[logger_console]
level=DEBUG
handlers=consoleHandler
formatter=pretty
qualname=console

[logger_file]
level=DEBUG
handlers=fileHandler
formatter=pretty
qualname=file

#######################################################################
#handlers的具体配置实现
#必须是 handler_name  name为handlers中key的值
#class为logging包里面的handler处理器
#formatter 日志输入格式
#args handler相关参数

[handlers]
keys=rootHandler,consoleHandler,fileHandler

[handler_rootHandler]
class=StreamHandler
level=DEBUG
formatter=pretty
args=(sys.stdout,)

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=pretty
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=pretty
args=("./log.log","a")

#######################################################################
#日志输出格式化实现
#datefmt 日期格式 对应asctime


[formatters]
keys=pretty

[formatter_pretty]
format=[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s
datefmt=%a, %d %b %Y %H:%M:%S

引用

import logging.config
if __name__ == '__main__':
    logconf=open('./log.conf',encoding='UTF-8')
    logging.config.fileConfig(logconf)
    logconf.close()
    logger = logging.getLogger('file')
    logger.debug("debug message")
    logger.info("info message")
    logger.warning("warning message")
    logger.critical("critical message")

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonlogging模块提供了灵活的日志记录功能,可以将日志输出到文件、控制台、网络等各种目标。下面是一个简单的logging封装示例,您可以根据自己的需求进行修改和扩展。 ```python import logging class Logger: def __init__(self, name=__name__, level=logging.DEBUG): self.logger = logging.getLogger(name) self.logger.setLevel(level) formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(name)s: %(message)s') console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) self.logger.addHandler(console_handler) file_handler = logging.FileHandler('app.log') file_handler.setFormatter(formatter) self.logger.addHandler(file_handler) def debug(self, message): self.logger.debug(message) def info(self, message): self.logger.info(message) def warning(self, message): self.logger.warning(message) def error(self, message): self.logger.error(message) def critical(self, message): self.logger.critical(message) ``` 在上述代码中,我们定义了一个Logger类,它包含了一个logger对象和几个日志级别的方法。在初始化时,我们设置了日志级别、日志格式和两个Handler(控制台和文件)。日志级别可以根据需要进行调整,常见的级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL。日志格式可以根据自己的需要进行修改,上面的格式包含了时间、级别、日志名称和消息内容。 使用该Logger类时,可以先创建一个实例对象,然后调用对应的方法记录日志,例如: ```python logger = Logger(__name__) logger.debug('This is a debug message') logger.info('This is an info message') logger.warning('This is a warning message') logger.error('This is an error message') logger.critical('This is a critical message') ``` 该示例中,我们创建了一个名为logger的Logger对象,并记录了五个不同级别的日志。控制台和文件中将分别输出这些日志信息。 当然,上述示例只是一个简单的封装,您可以根据自己的需求进行扩展,例如添加网络输出、邮件通知等功能。同时,您还可以使用Pythonlogging模块提供的其他功能,例如过滤器、处理器、格式化器等,以满足更复杂的日志需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值