Spaces:
Running
Running
Commit
·
d72801c
1
Parent(s):
4856b42
Deploy Signal Generator app
Browse files- src/main.py +33 -1
- src/templates/logs.html +4 -0
src/main.py
CHANGED
|
@@ -15,9 +15,41 @@ from src.db.local_database import LocalDatabase, DatabaseEntry, DataType
|
|
| 15 |
from run_saturday_analysis import run_saturday_analysis
|
| 16 |
|
| 17 |
# Configure logging
|
| 18 |
-
logging.basicConfig(level=logging.INFO)
|
| 19 |
logger = logging.getLogger(__name__)
|
| 20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
app = FastAPI(title="Stock Alchemist Signal Generator")
|
| 22 |
|
| 23 |
# --- Models ---
|
|
|
|
| 15 |
from run_saturday_analysis import run_saturday_analysis
|
| 16 |
|
| 17 |
# Configure logging
|
| 18 |
+
# logging.basicConfig(level=logging.INFO) # Replaced by handler below
|
| 19 |
logger = logging.getLogger(__name__)
|
| 20 |
|
| 21 |
+
# --- Logging Capture Setup ---
|
| 22 |
+
import collections
|
| 23 |
+
# Create a thread-safe buffer for logs
|
| 24 |
+
log_buffer = collections.deque(maxlen=2000)
|
| 25 |
+
|
| 26 |
+
class LogCaptureHandler(logging.Handler):
|
| 27 |
+
def emit(self, record):
|
| 28 |
+
try:
|
| 29 |
+
log_entry = self.format(record)
|
| 30 |
+
# Prepend timestamp if not present
|
| 31 |
+
# if not log_entry.startswith("20"):
|
| 32 |
+
# log_entry = f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - {log_entry}"
|
| 33 |
+
log_buffer.append(log_entry)
|
| 34 |
+
except Exception:
|
| 35 |
+
self.handleError(record)
|
| 36 |
+
|
| 37 |
+
# Setup Root Logger to capture ALL logs (including Coordinator)
|
| 38 |
+
root_logger = logging.getLogger()
|
| 39 |
+
root_logger.setLevel(logging.INFO)
|
| 40 |
+
|
| 41 |
+
# Avoid adding duplicate handlers if reloaded
|
| 42 |
+
if not any(isinstance(h, LogCaptureHandler) for h in root_logger.handlers):
|
| 43 |
+
capture_handler = LogCaptureHandler()
|
| 44 |
+
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
| 45 |
+
capture_handler.setFormatter(formatter)
|
| 46 |
+
root_logger.addHandler(capture_handler)
|
| 47 |
+
|
| 48 |
+
# Add console handler too if not present
|
| 49 |
+
console_handler = logging.StreamHandler(sys.stdout)
|
| 50 |
+
console_handler.setFormatter(formatter)
|
| 51 |
+
root_logger.addHandler(console_handler)
|
| 52 |
+
|
| 53 |
app = FastAPI(title="Stock Alchemist Signal Generator")
|
| 54 |
|
| 55 |
# --- Models ---
|
src/templates/logs.html
CHANGED
|
@@ -132,6 +132,10 @@
|
|
| 132 |
}
|
| 133 |
} catch (e) {
|
| 134 |
console.error("Failed to fetch logs", e);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
}
|
| 136 |
}
|
| 137 |
|
|
|
|
| 132 |
}
|
| 133 |
} catch (e) {
|
| 134 |
console.error("Failed to fetch logs", e);
|
| 135 |
+
// Only show error if container is empty or we really want to know
|
| 136 |
+
if (container.innerText === 'Loading logs...') {
|
| 137 |
+
container.innerHTML = `<div class="log-error">Failed to load logs: ${e.message}. \nCheck console for details.</div>`;
|
| 138 |
+
}
|
| 139 |
}
|
| 140 |
}
|
| 141 |
|