logging 模块是python中的一个标准库模块,有标准库模块提供日志记录API的关键好处是所有python模块都可以使用这个日志记录功能
日志级别
日志级别(level) | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型场景是问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样工作 |
WARNNING | 当某些不期望的事情发生的时记录的信息,但是此时程序还是在正常运行 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行的时候记录的信息 |
CRITICAL | 当发生严重错误的时候导致程序不能继续运行时记录的信息 |
日志实现
第一步,先创建生成日志文件的文件夹
# 获取存储日志的路径
cur_path = os.path.dirname(os.path.realpath(__file__))
log_path = os.path.join(os.path.dirname(cur_path), 'Data')
# 如果不存在日志文件夹,自动创建
if not os.path.exists(log_path):
os.makedirs(log_path)
然后创建日志类
class Log:
def __init__(self):
# 文件命名
self.logname = os.path.join(log_path, '%s.log' % time.strftime('%Y-%m-%d'))
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
# 日志输出格式
self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s - %(levelname)s:%(message)s')
logging模块中格式字符串字段
字段/属性名称 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志时间发生的时间,人类可读时间,如:2020-10-02 18:00:20,394 |
created | %(created)f | 日志发生的时间--时间戳,即调用time.time()函数返回的值 |
relativeCreated | %(relativeCreated)d | 日志时间发生的时间相对于logging加载时间的相对毫秒数 |
msecs | %(msec)d | 日志发生时间的毫秒部分 |
levelname | %(levelname)s | 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
levelno | %(levelno)s | 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50) |
name | %(name)s | 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger |
message | %(message)s | 日志记录的文本内容,通过 msg % args 计算得到的 |
pathname | %(pathname)s | 调用日志记录函数的源码文件的全路径 |
filename | %(filename)s | pathname的文件名部分,包含文件后缀 |
module | %(module)s | filename的名称部分,不包含后缀 |
lineno | %(lineno)d | 调用日志记录函数的源代码所在的行号 |
funcName | %(funcName)s | 调用日志记录函数的函数名 |
process | %(process)d | 进程ID |
processName | %(processName)s | 进程名称,Python 3.1新增 |
thread | %(thread)d | 线程ID |
threadName | %(threadName)s | 线程名称 |
创建一个私有方法,实例化两个对象
def __console(self, level, message):
# 创建一个FileHandler对象用于写到本地的日志文件
fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter) # 设置日志输出格式
self.logger.addHandler(fh)
# 创建一个StreamHandler对象,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter) # 设置日志输出格式
self.logger.addHandler(ch)
if level == 'info':
self.logger.info(message)
self.logger.debug(message)
if level == 'warning':
self.logger.warning(message)
if level == 'error':
self.logger.error(message)
# 这两行代码是为了避免日志输出重复问题
self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
fh.close()
def debug(self, message):
self.__console('debug', message)
def info(self, message):
self.__console('info', message)
def warning(self, message):
self.__console('warning', message)
def error(self, message):
self.__console('error', message)
def get_log(self):
return self.logger