120 lines
3.8 KiB
Python
120 lines
3.8 KiB
Python
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实例(与第一个是同一个实例)")
|