easyquant/kit/logger.py

120 lines
3.8 KiB
Python
Raw Normal View History

2025-07-03 23:39:31 +08:00
import logging
import os
from datetime import datetime
from config.network_config import network_config
class Logger:
"""
简单的日志操作类支持控制台和文件输出
可以使用现有的logger对象或创建新的实例
"""
_instance = None
def __new__(cls, existing_logger=None, *args, **kwargs):
if existing_logger is not None:
# 如果提供了现有的logger对象创建新实例并使用该对象
instance = super().__new__(cls)
instance.logger = existing_logger
return instance
# 否则使用单例模式
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, existing_logger=None, log_file="logs/app.log"):
# 如果使用现有logger直接返回
if existing_logger is not None:
return
# 如果已经初始化过,直接返回
if hasattr(self, 'logger'):
return
# 创建logs目录如果不存在
os.makedirs(os.path.dirname(log_file), exist_ok=True)
# 初始化logger
self.logger = logging.getLogger('AppLogger')
self.logger.setLevel(logging.DEBUG)
# 清除可能存在的处理器
self.logger.handlers.clear()
# 设置日志格式
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 添加控制台处理器
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
self.logger.addHandler(console_handler)
# 添加文件处理器
file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setFormatter(formatter)
self.logger.addHandler(file_handler)
def debug(self, message, strategy_id=None):
"""记录调试级别的日志"""
self.logger.debug(message)
try:
network_config.insert_logs(strategy_id, "debug", message)
except:
pass
def info(self, message, strategy_id=None):
"""记录信息级别的日志"""
self.logger.info(message)
try:
network_config.insert_logs(strategy_id, "info ", message)
except:
pass
def warning(self, message, strategy_id=None):
"""记录警告级别的日志"""
self.logger.warning(message)
try:
network_config.insert_logs(strategy_id, "warn", message)
except:
pass
def error(self, message, strategy_id=None):
"""记录错误级别的日志"""
self.logger.error(message)
try:
network_config.insert_logs(strategy_id, "error", message)
except:
pass
def critical(self, message, strategy_id=None):
"""记录严重错误级别的日志"""
self.logger.critical(message)
try:
network_config.insert_logs(strategy_id, "critical", message)
except:
pass
# # 使用示例
# if __name__ == "__main__":
# # 示例1创建新的logger实例
# logger = Logger()
# logger.info("这是一个新创建的logger实例")
#
# # 示例2使用现有的logger对象
# existing_logger = logging.getLogger('ExistingLogger')
# existing_logger.setLevel(logging.DEBUG)
# handler = logging.StreamHandler()
# handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
# existing_logger.addHandler(handler)
#
# logger2 = Logger(existing_logger=existing_logger)
# logger2.info("这是使用现有logger对象创建的实例")
#
# # 示例3测试单例模式不传入existing_logger时
# logger3 = Logger()
# logger3.info("这条日志来自第三个logger实例与第一个是同一个实例")