0
点赞
收藏
分享

微信扫一扫

python日志封装成一个类(2023年2月)


写这篇文章的背景:

一个复杂并且运行时间很长的程序,如果你没有用日志记录运行的信息。一旦出错,根据错误信息,你可能无法复现当时的情况。在程序运行过程中记录好运行信息尤为重要

文章目录

  • ​​ 将日志封装成一个类​​
  • ​​如何使用上面那个类​​

代码如下文件名为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高手,你可以改我的类,如果不是的话,这个类定义的功能够用了。


举报

相关推荐

0 条评论