python3 logging_python3 logging日志封装实例

一个完整的程序离不开日志,无论是开发阶段,还是测试阶段,亦或程序运行阶段,都可以通过日志查看程序的运行情况,或是定位问题。

下面是对 python3 的日志库 logging 进行了封装,对于大部分的需求应该是能满足的。(如果有不满足的地方,欢迎在下方留言)

程序结构:

|--logger.py

|

|--singleton.py

|

|--demo.py

|

|--log

| |

| 2018-10-12.log

logger.py

import os

import sys

import time

import logging

from singleton import Singleton

@Singleton # 如需打印不同路径的日志(运行日志、审计日志),则不能使用单例模式(注释或删除此行)。此外,还需设定参数name。

class Logger:

def __init__(self, set_level="INFO",

name=os.path.split(os.path.splitext(sys.argv[0])[0])[-1],

log_name=time.strftime("%Y-%m-%d.log", time.localtime()),

log_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "log"),

use_console=True):

"""

:param set_level: 日志级别["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默认为INFO

:param name: 日志中打印的name,默认为运行程序的name

:param log_name: 日志文件的名字,默认为当前时间(年-月-日.log)

:param log_path: 日志文件夹的路径,默认为logger.py同级目录中的log文件夹

:param use_console: 是否在控制台打印,默认为True

"""

if not set_level:

set_level = self._exec_type() # 设置set_level为None,自动获取当前运行模式

self.__logger = logging.getLogger(name)

self.setLevel(getattr(logging, set_level.upper()) if hasattr(logging, set_level.upper()) else logging.INFO) # 设置日志级别

if not os.path.exists(log_path): # 创建日志目录

os.makedirs(log_path)

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

handler_list = list()

handler_list.append(logging.FileHandler(os.path.join(log_path, log_name), encoding="utf-8"))

if use_console:

handler_list.append(logging.StreamHandler())

for handler in handler_list:

handler.setFormatter(formatter)

self.addHandler(handler)

def __getattr__(self, item):

return getattr(self.logger, item)

@property

def logger(self):

return self.__logger

@logger.setter

def logger(self, func):

self.__logger = func

def _exec_type(self):

return "DEBUG" if os.environ.get("IPYTHONENABLE") else "INFO"

singleton.py

class Singleton:

"""

单例装饰器。

"""

__cls = dict()

def __init__(self, cls):

self.__key = cls

def __call__(self, *args, **kwargs):

if self.__key not in self.cls:

self[self.__key] = self.__key(*args, **kwargs)

return self[self.__key]

def __setitem__(self, key, value):

self.cls[key] = value

def __getitem__(self, item):

return self.cls[item]

@property

def cls(self):

return self.__cls

@cls.setter

def cls(self, cls):

self.__cls = cls

demo.py

import logger

x = logger.Logger("debug")

x.critical("这是一个 critical 级别的问题!")

x.error("这是一个 error 级别的问题!")

x.warning("这是一个 warning 级别的问题!")

x.info("这是一个 info 级别的问题!")

x.debug("这是一个 debug 级别的问题!")

x.log(50, "这是一个 critical 级别的问题的另一种写法!")

x.log(40, "这是一个 error 级别的问题的另一种写法!")

x.log(30, "这是一个 warning 级别的问题的另一种写法!")

x.log(20, "这是一个 info 级别的问题的另一种写法!")

x.log(10, "这是一个 debug 级别的问题的另一种写法!")

x.log(51, "这是一个 Level 51 级别的问题!")

x.log(11, "这是一个 Level 11 级别的问题!")

x.log(9, "这条日志等级低于 debug,不会被打印")

x.log(0, "这条日志同样不会被打印")

"""

运行结果:

2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题!

2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题!

2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题!

2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题!

2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题!

2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - Level 51 - 这是一个 Level 51 级别的问题!

2018-10-12 00:18:06,562 - demo - Level 11 - 这是一个 Level 11 级别的问题!

"""

2018-10-12.log

2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题!

2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题!

2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题!

2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题!

2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题!

2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题的另一种写法!

2018-10-12 00:18:06,562 - demo - Level 51 - 这是一个 Level 51 级别的问题!

2018-10-12 00:18:06,562 - demo - Level 11 - 这是一个 Level 11 级别的问题!

以上这篇python3 logging日志封装实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的logging模块提供了灵活的日志记录功能,可以将日志输出到文件、控制台、网络等各种目标。下面是一个简单的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对象,并记录了五个不同级别的日志。控制台和文件中将分别输出这些日志信息。 当然,上述示例只是一个简单的封装,您可以根据自己的需求进行扩展,例如添加网络输出、邮件通知等功能。同时,您还可以使用Python的logging模块提供的其他功能,例如过滤器、处理器、格式化器等,以满足更复杂的日志需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值