2025-10-16 18:03:12 -04:00 | | | //+------------------------------------------------------------------+
|
2026-02-05 23:31:20 -05:00 | | | //| LogMiddleware.mqh - Logging Middleware Stub |
|
| | | //| Provides backward compatible logging functionality |
|
2025-10-16 18:03:12 -04:00 | | | //+------------------------------------------------------------------+
|
2026-02-05 23:31:20 -05:00 | | | #ifndef LOGMIDDLEWARE_MQH
|
| | | #define LOGMIDDLEWARE_MQH
|
2025-10-16 18:03:12 -04:00 | | |
|
2026-02-05 23:31:20 -05:00 | | | // MQL5 native includes only - no C++ stdlib
|
| | | #include <Files\File.mqh>
|
2025-10-16 18:03:12 -04:00 | | |
|
2026-02-05 23:31:20 -05:00 | | | // Simple LOG macro - just prints to console
|
| | | #define LOG(msg) Print(msg)
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Simple Log Middleware Class |
|
| | | //+------------------------------------------------------------------+
|
2025-10-16 18:03:12 -04:00 | | | class CLogMiddleware
|
| | | {
|
| | | private:
|
2026-02-05 23:31:20 -05:00 | | | string m_logFile;
|
| | | bool m_enabled;
|
| | | bool m_useDebugPrint;
|
2026-02-24 12:47:37 -05:00 | | | bool m_is_tester;
|
2025-10-16 18:03:12 -04:00 | | |
|
| | | public:
|
2026-02-05 23:31:20 -05:00 | | | // Constructor
|
| | | CLogMiddleware(string logFile = "", bool enabled = true)
|
2025-10-16 18:03:12 -04:00 | | | {
|
2026-02-05 23:31:20 -05:00 | | | m_logFile = logFile;
|
| | | m_enabled = enabled;
|
| | | m_useDebugPrint = true;
|
2026-02-24 12:47:37 -05:00 | | | m_is_tester = (MQLInfoInteger(MQL_TESTER) != 0);
|
| | |
|
| | | // In tester mode, disable file logging to prevent crashes
|
| | | if(m_is_tester)
|
| | | {
|
| | | m_logFile = ""; // Disable file logging in tester
|
| | | Print("[LogMiddleware] TESTER MODE: File logging disabled");
|
| | | }
|
2025-10-16 18:03:12 -04:00 | | | }
|
| | |
|
2026-02-05 23:31:20 -05:00 | | | // Destructor
|
| | | ~CLogMiddleware() {}
|
| | |
|
| | | // Log a message
|
| | | void Log(string message)
|
2025-10-16 18:03:12 -04:00 | | | {
|
2026-02-05 23:31:20 -05:00 | | | if (!m_enabled) return;
|
| | |
|
| | | string timestamp = TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS);
|
| | | string logLine = "[" + timestamp + "] " + message;
|
| | |
|
| | | // Print to Experts log
|
| | | Print(logLine);
|
| | |
|
2026-02-24 12:47:37 -05:00 | | | // Write to file if specified (disabled in tester mode)
|
| | | if (!m_is_tester && StringLen(m_logFile) > 0)
|
2025-10-16 18:03:12 -04:00 | | | {
|
2026-02-24 12:47:37 -05:00 | | | // Ensure directory exists before writing
|
| | | string folder = "";
|
| | | int sepPos = StringFind(m_logFile, "\\");
|
| | | if(sepPos > 0)
|
| | | {
|
| | | folder = StringSubstr(m_logFile, 0, sepPos);
|
| | | FolderCreate(folder, FILE_COMMON);
|
| | | }
|
| | |
|
2026-02-05 23:31:20 -05:00 | | | int handle = FileOpen(m_logFile, FILE_WRITE | FILE_TXT | FILE_COMMON);
|
| | | if (handle != INVALID_HANDLE)
|
| | | {
|
| | | FileSeek(handle, 0, SEEK_END);
|
| | | FileWriteString(handle, logLine + "\r\n");
|
| | | FileClose(handle);
|
| | | }
|
2025-10-16 18:03:12 -04:00 | | | }
|
| | | }
|
| | |
|
2026-02-05 23:31:20 -05:00 | | | // Set enabled state
|
| | | void SetEnabled(bool enabled) { m_enabled = enabled; }
|
| | | bool IsEnabled() const { return m_enabled; }
|
2025-10-16 18:03:12 -04:00 | | |
|
2026-02-05 23:31:20 -05:00 | | | // Set log file
|
| | | void SetLogFile(string logFile) { m_logFile = logFile; }
|
| | | string GetLogFile() const { return m_logFile; }
|
| | | };
|
2025-10-16 18:03:12 -04:00 | | |
|
2026-02-05 23:31:20 -05:00 | | | // Global singleton for backward compatibility
|
| | | CLogMiddleware* LogMiddleware = NULL;
|
2025-10-16 18:03:12 -04:00 | | |
|
2026-02-05 23:31:20 -05:00 | | | #endif // LOGMIDDLEWARE_MQH
|