写这篇文章的背景:
一个复杂并且运行时间很长的程序,如果你没有用日志记录运行的信息。一旦出错,根据错误信息,你可能无法复现当时的情况。在程序运行过程中记录好运行信息尤为重要
将日志封装成一个类
代码如下文件名为get_logger.py,所有说明看注释、看注释、看注释。这个类我一直在生产环境中使用,没出错过,可以直接复制过去使用。如果有不明白的地方,参考logger官网:https://docs.python.org/zh-cn/3/howto/logging.html#logging-basic-tutorial
import logging
import logging.handlers
import datetime
import os
def get_logger(level_name, log_dir, log_name='api_logger'):
# 创建目录
if not os.path.exists(log_dir):
os.makedirs(log_dir)
logger = logging.getLogger(log_name)
if len(logger.handlers)>0:
# 已经创建过,直接返回
return logger
logger.setLevel(logging._nameToLevel[level_name])
rf_handler = logging.handlers.TimedRotatingFileHandler(
os.path.join(log_dir, 'all.log'),
when='midnight',
interval=1,
backupCount=7,
atTime=datetime.time(0, 0, 0, 0),
encoding='utf-8'
)
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
f_handler = logging.FileHandler(os.path.join(log_dir, 'error.log'))
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))
s_handler = logging.StreamHandler()
s_handler.setLevel(logging.DEBUG)
s_handler.setFormatter(logging.Formatter("%(asctime)s[%(levelname)s]:%(message)s"))
logger.addHandler(rf_handler)
logger.addHandler(f_handler)
logger.addHandler(s_handler)
return logger
如何使用上面那个类
如果你有一个程序文件main.py
from get_logger import get_logger
logger_man = get_logger(
level_name = 'DeBug', # 日志等级
log_dir = './path', # 日志文件存放的目录
log_name='api_logger' # 这个日志对象的名字,相同名字的日志对象会将信息写到一块
)
class DoSomething():
def work(self):
# 做一些事情1,然后你将过程日志记录下来
logger_man.warning('日志信息') # 这里的logger_man就是上面我们创建的日志实例
# 做一些事情2
pass
return None
这样子就可以把程序所有的过程信息记录下来了。
创建这个类是自定义创建的,当然如果你是logger高手,你可以改我的类,如果不是的话,这个类定义的功能够用了。