feat: 优化日志记录
This commit is contained in:
@@ -6,11 +6,10 @@ import requests
|
||||
from typing import Dict, List, Optional, Tuple, Generator
|
||||
from dotenv import load_dotenv
|
||||
import json
|
||||
from logger import get_logger, get_stream_logger
|
||||
from logger import get_logger
|
||||
|
||||
# 获取日志器
|
||||
logger = get_logger()
|
||||
stream_logger = get_stream_logger()
|
||||
|
||||
class StockAnalyzer:
|
||||
def __init__(self, initial_cash=1000000, custom_api_url=None, custom_api_key=None, custom_api_model=None):
|
||||
@@ -246,7 +245,7 @@ class StockAnalyzer:
|
||||
请基于技术指标和市场动态进行分析,给出具体数据支持。
|
||||
"""
|
||||
|
||||
logger.debug(f"生成的AI分析提示词: {prompt[:100]}...")
|
||||
logger.debug(f"生成的AI分析提示词: {self._truncate_json_for_logging(prompt, 100)}...")
|
||||
|
||||
# 检查API配置
|
||||
if not self.API_URL:
|
||||
@@ -289,7 +288,7 @@ class StockAnalyzer:
|
||||
|
||||
try:
|
||||
logger.debug(f"发起流式API请求: {api_url}")
|
||||
logger.debug(f"请求载荷: {json.dumps(payload, indent=2)}")
|
||||
logger.debug(f"请求载荷: {self._truncate_json_for_logging(payload)}")
|
||||
|
||||
response = requests.post(
|
||||
api_url,
|
||||
@@ -307,7 +306,7 @@ class StockAnalyzer:
|
||||
else:
|
||||
try:
|
||||
error_response = response.json()
|
||||
error_text = json.dumps(error_response, indent=2)
|
||||
error_text = self._truncate_json_for_logging(error_response)
|
||||
except:
|
||||
error_text = response.text[:500] if response.text else "无响应内容"
|
||||
|
||||
@@ -343,7 +342,7 @@ class StockAnalyzer:
|
||||
else:
|
||||
try:
|
||||
error_response = response.json()
|
||||
error_text = json.dumps(error_response, indent=2)
|
||||
error_text = self._truncate_json_for_logging(error_response)
|
||||
except:
|
||||
error_text = response.text[:500] if response.text else "无响应内容"
|
||||
|
||||
@@ -365,11 +364,26 @@ class StockAnalyzer:
|
||||
if stream:
|
||||
logger.debug("在流式模式下返回异常信息")
|
||||
error_json = json.dumps({"stock_code": stock_code, "error": error_msg})
|
||||
stream_logger.info(f"流式异常输出: {error_json}")
|
||||
logger.info(f"流式异常输出: {error_json}")
|
||||
yield error_json
|
||||
else:
|
||||
return error_msg
|
||||
|
||||
def _truncate_json_for_logging(self, json_obj, max_length=500):
|
||||
"""截断JSON对象用于日志记录,避免日志过大
|
||||
|
||||
Args:
|
||||
json_obj: 要截断的JSON对象
|
||||
max_length: 最大字符长度,默认500
|
||||
|
||||
Returns:
|
||||
str: 截断后的JSON字符串
|
||||
"""
|
||||
json_str = json.dumps(json_obj, ensure_ascii=False)
|
||||
if len(json_str) <= max_length:
|
||||
return json_str
|
||||
return json_str[:max_length] + f"... [截断,总长度: {len(json_str)}字符]"
|
||||
|
||||
def _process_ai_stream(self, response, stock_code) -> Generator[str, None, None]:
|
||||
"""处理AI流式响应"""
|
||||
logger.info(f"开始处理股票 {stock_code} 的AI流式响应")
|
||||
@@ -380,7 +394,6 @@ class StockAnalyzer:
|
||||
for line in response.iter_lines():
|
||||
if line:
|
||||
line = line.decode('utf-8')
|
||||
stream_logger.info(f"原始流式行: {line}")
|
||||
|
||||
# 跳过保持连接的空行
|
||||
if line.strip() == '':
|
||||
@@ -390,7 +403,6 @@ class StockAnalyzer:
|
||||
# 数据行通常以"data: "开头
|
||||
if line.startswith('data: '):
|
||||
data_content = line[6:] # 移除 "data: " 前缀
|
||||
stream_logger.info(f"数据内容: {data_content}")
|
||||
|
||||
# 检查是否为流的结束
|
||||
if data_content.strip() == '[DONE]':
|
||||
@@ -399,7 +411,6 @@ class StockAnalyzer:
|
||||
|
||||
try:
|
||||
json_data = json.loads(data_content)
|
||||
logger.debug(f"解析的JSON数据: {json.dumps(json_data)[:100]}...")
|
||||
|
||||
if 'choices' in json_data:
|
||||
delta = json_data['choices'][0].get('delta', {})
|
||||
@@ -408,15 +419,12 @@ class StockAnalyzer:
|
||||
if content:
|
||||
chunk_count += 1
|
||||
buffer += content
|
||||
logger.debug(f"收到内容片段 #{chunk_count}: {content}")
|
||||
stream_logger.info(f"发送内容片段: {content}")
|
||||
|
||||
|
||||
# 创建包含AI分析片段的JSON
|
||||
chunk_json = json.dumps({
|
||||
"stock_code": stock_code,
|
||||
"ai_analysis_chunk": content
|
||||
})
|
||||
stream_logger.info(f"流式输出JSON: {chunk_json}")
|
||||
yield chunk_json
|
||||
except json.JSONDecodeError as e:
|
||||
logger.error(f"JSON解析错误: {str(e)}, 行内容: {data_content}")
|
||||
@@ -488,7 +496,7 @@ class StockAnalyzer:
|
||||
'volume_status': 'HIGH' if latest['Volume_Ratio'] > 1.5 else 'NORMAL',
|
||||
'recommendation': self.get_recommendation(score)
|
||||
}
|
||||
logger.debug(f"生成股票 {stock_code} 基础报告: {json.dumps(report)[:100]}...")
|
||||
logger.debug(f"生成股票 {stock_code} 基础报告: {self._truncate_json_for_logging(report, 100)}...")
|
||||
|
||||
if stream:
|
||||
logger.info(f"以流式模式返回股票 {stock_code} 分析结果")
|
||||
@@ -496,8 +504,8 @@ class StockAnalyzer:
|
||||
base_report = dict(report)
|
||||
base_report['ai_analysis'] = ''
|
||||
base_report_json = json.dumps(base_report)
|
||||
logger.debug(f"基础报告JSON: {base_report_json[:100]}...")
|
||||
stream_logger.info(f"发送基础报告: {base_report_json}")
|
||||
logger.debug(f"基础报告JSON: {self._truncate_json_for_logging(base_report_json, 100)}...")
|
||||
logger.info(f"发送基础报告: {base_report_json}")
|
||||
yield base_report_json
|
||||
|
||||
# 然后流式返回AI分析部分
|
||||
@@ -505,7 +513,6 @@ class StockAnalyzer:
|
||||
ai_chunks_count = 0
|
||||
for ai_chunk in self.get_ai_analysis(df, stock_code, stream=True):
|
||||
ai_chunks_count += 1
|
||||
stream_logger.info(f"股票 {stock_code} 流式块 #{ai_chunks_count}: {ai_chunk}")
|
||||
yield ai_chunk
|
||||
logger.info(f"股票 {stock_code} 流式AI分析完成,共发送 {ai_chunks_count} 个块")
|
||||
else:
|
||||
@@ -522,7 +529,7 @@ class StockAnalyzer:
|
||||
|
||||
if stream:
|
||||
error_json = json.dumps({'stock_code': stock_code, 'error': error_msg})
|
||||
stream_logger.info(f"流式错误输出: {error_json}")
|
||||
logger.info(f"流式错误输出: {error_json}")
|
||||
yield error_json
|
||||
else:
|
||||
raise
|
||||
@@ -564,7 +571,6 @@ class StockAnalyzer:
|
||||
chunk_count = 0
|
||||
for chunk in self.analyze_stock(stock_code, market_type, stream=True):
|
||||
chunk_count += 1
|
||||
stream_logger.info(f"股票 {stock_code} 流式块 #{chunk_count}: {chunk}")
|
||||
yield chunk
|
||||
logger.debug(f"股票 {stock_code} 流式分析完成,共 {chunk_count} 个块")
|
||||
except Exception as e:
|
||||
@@ -572,6 +578,6 @@ class StockAnalyzer:
|
||||
logger.error(error_msg)
|
||||
logger.exception(e)
|
||||
error_json = json.dumps({'stock_code': stock_code, 'error': error_msg})
|
||||
stream_logger.info(f"流式错误输出: {error_json}")
|
||||
logger.info(f"流式错误输出: {error_json}")
|
||||
yield error_json
|
||||
logger.info(f"流式扫描完成,处理了 {stock_count} 只股票")
|
||||
|
||||
Reference in New Issue
Block a user