一、日志的使用
import logging
# 创建一个记录器对象
logger = logging.getLogger()
# 设置日志级别
logger.setLevel(logging.INFO)
# 设置日志的保存路径
logfile = 'path/data.logs'
# 指定文件处理器,发送日志输出到磁盘文件
fh = logging.FileHandler(logfile, encoding='utf-8')
fh.setLevel(logging.INFO)
# 指定流处理器,发送日志输出
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
# 创建格式化程序,指定日志的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 给文件文件处理器和流处理器指定格式化成
fh.setFormatter(formatter)
sh.setFormatter(formatter)
# 添加处理程序对象
logger.addHandler(fh)
logger.addHandler(sh)
二、日志的输出格式
%(name)s 记录器的名称
%(levelno)s 数字形式的日志记录级别
%(levelname)s 日志记录级别的文本名称
%(filename)s 执行日志记录调用的源文件的文件名称
%(pathname)s 执行日志记录调用的源文件的路径名称
%(funcName)s 执行日志记录调用的函数名称
%(module)s 执行日志记录调用的模块名称
%(lineno)s 执行日志记录调用的行号
%(created)s 执行日志记录的时间
%(asctime)s 日期和时间
%(msecs)s 毫秒部分
%(thread)d 线程ID
%(threadName)s 线程名称
%(process)d 进程ID
%(message)s 记录的消息
三、自定义日志管理器
class CustomLogger:
def __init__(self, platform, path_dir, log_name):
self.log_name = log_name
self.path_dir = str(path_dir)
self.platform = platform
if not os.path.exists(f"./{self.platform}_logs/{self.path_dir}"):
os.makedirs(f"./{self.platform}_logs/{self.path_dir}", exist_ok=True)
# 创建一个记录器对象
_logger = logging.getLogger(self.log_name)
# 设置日志级别
_logger.setLevel(logging.INFO)
# 设置日志的保存路径
logfile = f'./{self.platform}_logs/{self.path_dir}/{self.log_name}.logs'
# 指定文件处理器,发送日志输出到磁盘文件
fh = logging.FileHandler(logfile, encoding='utf-8')
fh.setLevel(logging.INFO)
# 指定流处理器,发送日志输出
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
# 创建格式化程序,指定日志的输出格式
formatter = logging.Formatter("%(asctime)s 【%(name)s】 \n- %(levelname)s: %(message)s")
# 给文件文件处理器和流处理器指定格式化成
fh.setFormatter(formatter)
sh.setFormatter(formatter)
# 添加处理程序对象
_logger.addHandler(fh)
_logger.addHandler(sh)
self.get_logger = _logger
@property
def info(self):
return self.get_logger.info
@property
def error(self):
return self.get_logger.error
@property
def warning(self):
return self.get_logger.warning
platform = "主文件夹"
path_dir = "子文件夹"
log_name = "日志记录器对象的名称"
custom_logger = CustomLogger(platform=paltform, path_dir=path_dir, log_name=log_name)
custom_logger.info(f"hello world!!!!!!!!!!!!!{log_name}")
四、logging模块可能会出现的问题
4.1 logging日志重复输出
这种情况一般是发生在自带的longing.info和自己创建的logger.info混合使用的情况,如以下情况:
import logging
# 创建默认的日志管理器root
logger_root = logging.getLogger()
logger_root.setLevel(logging.INFO)
logging.info("logging原生日志") # 会使用默认的日志管理器root的相关配置去输出日志
# 创建一个记录器对象
logger = logging.getLogger("my_logger")
# 设置日志级别
logger.setLevel(logging.INFO)
# 指定流处理器,发送日志输出
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
# 创建格式化程序,指定日志的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 给文件文件处理器和流处理器指定格式化成
sh.setFormatter(formatter)
# 添加处理程序对象
logger.addHandler(sh)
# 当使用logging.info去输出日志时,再创建一个新的非root日志管理器去输出日志,会以该新创建的日志管理器的名称去输出一条日志,即重复日志
logger.info("hello") # 会输出两条日志
执行结果: