easyquant/kit/logger.py
2025-07-03 23:39:31 +08:00

120 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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实例与第一个是同一个实例")