//+------------------------------------------------------------------+ //| LogMiddleware.mqh - Logging Middleware Stub | //| Provides backward compatible logging functionality | //+------------------------------------------------------------------+ #ifndef LOGMIDDLEWARE_MQH #define LOGMIDDLEWARE_MQH // MQL5 native includes only - no C++ stdlib #include // Simple LOG macro - just prints to console #define LOG(msg) Print(msg) //+------------------------------------------------------------------+ //| Simple Log Middleware Class | //+------------------------------------------------------------------+ class CLogMiddleware { private: string m_logFile; bool m_enabled; bool m_useDebugPrint; bool m_is_tester; public: // Constructor CLogMiddleware(string logFile = "", bool enabled = true) { m_logFile = logFile; m_enabled = enabled; m_useDebugPrint = true; 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"); } } // Destructor ~CLogMiddleware() {} // Log a message void Log(string message) { if (!m_enabled) return; string timestamp = TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS); string logLine = "[" + timestamp + "] " + message; // Print to Experts log Print(logLine); // Write to file if specified (disabled in tester mode) if (!m_is_tester && StringLen(m_logFile) > 0) { // 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); } 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); } } } // Set enabled state void SetEnabled(bool enabled) { m_enabled = enabled; } bool IsEnabled() const { return m_enabled; } // Set log file void SetLogFile(string logFile) { m_logFile = logFile; } string GetLogFile() const { return m_logFile; } }; // Global singleton for backward compatibility CLogMiddleware* LogMiddleware = NULL; #endif // LOGMIDDLEWARE_MQH