Python logging模块进行封装实现原理解析
作者:不放弃自己 发布时间:2021-02-15 07:51:44
标签:Python,logging,模块,封装
1. 简介
追踪某些软件运行时所发生事件的方法, 可以在代码中调用日志中某些方法来记录发生的事情
一个事件可以用一个可包含可选变量数据的消息来描述
事件有自己的重要性等级
2. 使用logging日志系统四大组件
loggers日志器
提供应用程序代码直接使用的接口
handlers处理器
用于将日志记录发送到指定的目的位置
filters过滤器
过滤, 决定哪些输出哪些日志记录, 其余忽略
formatters格式器
控制日志输出格式
使用代码如下
import os, time, logging, sys
from Common.plugs.get_config import r_config
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
if sys.platform == "win32":
ENV_CONF_DIR = os.path.join(BASE_DIR, 'Common/conf/env_config.ini').replace('/', '\\')
else:
ENV_CONF_DIR = os.path.join(BASE_DIR, 'Common/conf/env_config.ini')
log_path = r_config(ENV_CONF_DIR, "log", "log_path")
class Log:
def __init__(self, log_path):
self.logName = os.path.join(log_path, '{0}.log'.format(time.strftime('%Y-%m-%d')))
def console_log(self, level, message):
# 创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于 debug 写入日志文件
debug_file = logging.FileHandler(self.logName, 'a+', encoding='utf-8')
debug_file.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
debug_file.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(debug_file)
logger.addHandler(ch)
# 记录一条日志
if level == 'info':
logger.info(message)
elif level == 'debug':
logger.debug(message)
elif level == 'warning':
logger.warning(message)
elif level == 'error':
logger.error(message)
elif level == 'critical':
logger.critical(message)
logger.removeHandler(ch)
logger.removeHandler(debug_file)
debug_file.close()
def debug(self, message): #最详细日志信息, 多用于问题诊断
self.console_log('debug', message)
def info(self, message): #仅次于DEBUG, 多用于记录关键点信息, 确保程序按预期执行
self.console_log('info', message)
def warning(self, message): #低等级故障, 但程序仍能运行, 如磁盘空间不足警告
self.console_log('warning', message)
def error(self, message): #由于比WARNING严重的问题, 导致某些功能不能正常运行时的记录
self.console_log('error', message)
def critical(self, message): 严重错误, 导致应用程序不能继续运行时的记录
self.console_log('critical', message)
if __name__ == '__main__':
Log(log_path).info("adasd")
Log(log_path).error("dsadasddasd")
'''
来源:https://www.cnblogs.com/hghua/p/13268007.html


猜你喜欢
- 使用keras时,加入keras的lambda层以实现自己定义的操作。但是,发现操作结果的shape信息有问题。我的后端是theano,使用
- 如下所示:from splinter.browser import Browserb = Browser('chrome')
- 在使用PyVista进行多线程同时显示多个窗口的时候,发现开启多个线程显示窗口,窗口会卡死,于是便有了这篇文章。发现问题在可视化工具——利用
- 前言提到数据库,你多半会联想到事务,进而还可能想起曾经背得滚瓜乱熟的ACID,不知道你有没有想过这个问题,事务有原子性、隔离性、一致性和持久
- 人工生命—群集智能—蚁群算法js版前言(摘自网上,代码是自己想出来的)对于普通大众来说,“人工生命”、“群集智能”、“仿生机器人”等等可能是
- 一、前言为方便描述教程例子,这里给出mysql表结构定义和golang结构体定义。下面是教程用到的foods表结构定义:CREATE TAB
- 看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下。在命令行模式下,可以执行
- 本文实例讲述了C#编程实现连接ACCESS数据库的方法。分享给大家供大家参考,具体如下:一、建立FORM窗体,加一个按钮控件,加一个DATA
- 方法一:需要在网络条件下安装win+R进入运行框输入命令cmd点击确定进入普通下载:pip install 模块名字例如:输入pi
- 如我们新建窗体FatherPage.htm: XML-Code: <script type="text/javascript
- 客户端调用XMLHTTP的过程很简单,只有5个步骤: 1、创建XMLHTTP对象 2、打开与服务端的连接,同时定义指令发送方式,服务网页(U
- 分享一个以前写的小游戏,纯js游戏,代码很简单。欢迎大家来喷呦!效果图: 代码展示://直接复制到html文件即可 支持IE9+版
- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据
- 什么是docstring在软件工程中,其实编码所占的部分是非常小的,大多是其它的事情,比如写文档。文档是沟通的工具。 在Python中,比较
- 比如有下面一段代码: for i in range(10): print ("%s" % (f_list[i].name
- NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供
- 本文实例为大家分享了python实现五子棋双人对弈的具体代码,供大家参考,具体内容如下我用的是pygame模块来制作窗口代码如下:# 1、引
- 目录一.预览1.启动2.执行查询二.源代码1.GUI2.Get_Attr三.总结Hello,大家好,我来敷衍你们了 [捂脸],今天还是用Tk
- 前言之前在看golang多线程通信的时候, 看到了go 的管道. 当时就觉得这玩意很神奇, 因为之前接触过的不管是php, java, Py
- 一、查询某个字段重复 select * from User u whe