fix: simplify logging for systemd compatibility and add ATR-based Stop Loss padding
This commit is contained in:
@@ -1,4 +1,9 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Force unbuffered output for systemd/logging
|
||||
os.environ['PYTHONUNBUFFERED'] = '1'
|
||||
|
||||
import time
|
||||
import logging
|
||||
import pytz
|
||||
@@ -13,47 +18,22 @@ from src.strategy.touch_turn import TouchTurnStrategy
|
||||
from src.execution.manager import ExecutionManager
|
||||
from scripts.find_isa_candidates import find_best_isa_tickers
|
||||
from scripts.backtest import backtest_ticker
|
||||
import sys
|
||||
|
||||
# Stream redirector to capture print() statements from sub-scripts into the log file
|
||||
class StreamToLogger:
|
||||
def __init__(self, logger, log_level=logging.INFO):
|
||||
self.logger = logger
|
||||
self.log_level = log_level
|
||||
self.linebuf = ''
|
||||
|
||||
def write(self, buf):
|
||||
for line in buf.rstrip().splitlines():
|
||||
self.logger.log(self.log_level, line.rstrip())
|
||||
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
# Force flush handler to ensure bot logs are written to disk immediately
|
||||
class FlushHandler(logging.FileHandler):
|
||||
def emit(self, record):
|
||||
super().emit(record)
|
||||
self.flush()
|
||||
|
||||
# Ensure logs directory exists
|
||||
os.makedirs("logs", exist_ok=True)
|
||||
log_filename = datetime.now().strftime("logs/bot_%Y-%m-%d.log")
|
||||
|
||||
# Configure logging
|
||||
file_handler = FlushHandler(log_filename, mode='a')
|
||||
stream_handler = logging.StreamHandler()
|
||||
|
||||
# Simple, robust logging setup
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s [%(threadName)s] %(levelname)s - %(message)s',
|
||||
handlers=[file_handler, stream_handler]
|
||||
handlers=[
|
||||
logging.FileHandler(log_filename, mode='a'),
|
||||
logging.StreamHandler(sys.stdout)
|
||||
]
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Redirect stdout and stderr
|
||||
sys.stdout = StreamToLogger(logger, logging.INFO)
|
||||
sys.stderr = StreamToLogger(logger, logging.ERROR)
|
||||
|
||||
def flush_logs():
|
||||
for handler in logging.getLogger().handlers:
|
||||
handler.flush()
|
||||
|
||||
Reference in New Issue
Block a user