Logify/Logify.mqh
2025-08-21 11:59:58 -03:00

280 lines
No EOL
25 KiB
MQL5

//+------------------------------------------------------------------+
//| Logify.mqh |
//| joaopedrodev |
//| https://www.mql5.com/en/users/joaopedrodev |
//+------------------------------------------------------------------+
#property copyright "joaopedrodev"
#property link "https://www.mql5.com/en/users/joaopedrodev"
#property version "1.00"
//+------------------------------------------------------------------+
//| Imports |
//+------------------------------------------------------------------+
#include "LogifyModel.mqh"
#include "Suppression/LogifySuppression.mqh"
#include "Handlers/LogifyHandler.mqh"
#include "Handlers/LogifyHandlerComment.mqh"
#include "Handlers/LogifyHandlerConsole.mqh"
#include "Handlers/LogifyHandlerDatabase.mqh"
#include "Handlers/LogifyHandlerFile.mqh"
#include "Error/LogifyError.mqh"
//+------------------------------------------------------------------+
//| Declares that CLogifyBuilder exists |
//+------------------------------------------------------------------+
class CLogifyBuilder;
//+------------------------------------------------------------------+
//| class : CLogify |
//| |
//| [PROPERTY] |
//| Name : Logify |
//| Heritage : No heritage |
//| Description : Core class for log management. |
//| |
//+------------------------------------------------------------------+
class CLogify
{
private:
CLogifyHandler *m_handlers[];
CLogifySuppression*m_suppression;
CLogifyError m_error;
public:
CLogify();
~CLogify();
static CLogifyBuilder *Create(void);
CLogifySuppression*Suppression(void);
//--- Language
void SetLanguage(ENUM_LOG_LANGUAGE language);
ENUM_LOG_LANGUAGE GetLanguage(void);
//--- Handler
void AddHandler(CLogifyHandler *handler);
bool HasHandler(string name);
CLogifyHandler *GetHandler(string name);
CLogifyHandler *GetHandler(int index);
int SizeHandlers(void);
//--- Generic method for adding logs
bool Append(ENUM_LOG_LEVEL level,string msg, string origin = "", string args = "",string filename="",string function="",int line=0,int code_error=0);
//--- Starts default handlers
void EnsureDefaultHandler();
//--- Specific methods for each log level
bool Debug(string msg, string origin = "", string args = "",string filename="",string function="",int line=0);
bool Info(string msg, string origin = "", string args = "",string filename="",string function="",int line=0);
bool Alert(string msg, string origin = "", string args = "",string filename="",string function="",int line=0);
bool Error(string msg, string origin = "", string args = "",string filename="",string function="",int line=0);
bool Error(string msg, int code_error, string origin = "", string args = "",string filename="",string function="",int line=0);
bool Fatal(string msg, string origin = "", string args = "",string filename="",string function="",int line=0);
bool Fatal(string msg, int code_error, string origin = "", string args = "",string filename="",string function="",int line=0);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CLogify::CLogify()
{
m_suppression = new CLogifySuppression();
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CLogify::~CLogify()
{
//--- Delete handlers
int size_handlers = ArraySize(m_handlers);
for(int i=0;i<size_handlers;i++)
{
if(CheckPointer(m_handlers[i]) != POINTER_INVALID)
{
m_handlers[i].Close();
delete m_handlers[i];
}
}
delete m_suppression;
}
//+------------------------------------------------------------------+
//| Sets the language for the log |
//+------------------------------------------------------------------+
void CLogify::SetLanguage(ENUM_LOG_LANGUAGE language)
{
m_error.SetLanguage(language);
}
//+------------------------------------------------------------------+
//| Get the language of the log |
//+------------------------------------------------------------------+
ENUM_LOG_LANGUAGE CLogify::GetLanguage(void)
{
return (m_error.GetLanguage());
}
//+------------------------------------------------------------------+
//| Add handler to handlers array |
//+------------------------------------------------------------------+
void CLogify::AddHandler(CLogifyHandler *handler)
{
int size = ArraySize(m_handlers);
ArrayResize(m_handlers,size+1);
m_handlers[size] = GetPointer(handler);
}
//+------------------------------------------------------------------+
//| Checks if handler is already in the array by name |
//+------------------------------------------------------------------+
bool CLogify::HasHandler(string name)
{
int size = ArraySize(m_handlers);
for(int i=0;i<size;i++)
{
if(m_handlers[i].GetName() == name)
{
return(true);
}
}
return(false);
}
//+------------------------------------------------------------------+
//| Get handler by name |
//+------------------------------------------------------------------+
CLogifyHandler *CLogify::GetHandler(string name)
{
int size = ArraySize(m_handlers);
for(int i=0;i<size;i++)
{
if(m_handlers[i].GetName() == name)
{
return(m_handlers[i]);
}
}
return(NULL);
}
//+------------------------------------------------------------------+
//| Get handler by index |
//+------------------------------------------------------------------+
CLogifyHandler *CLogify::GetHandler(int index)
{
return(m_handlers[index]);
}
//+------------------------------------------------------------------+
//| Gets the total size of the handlers array |
//+------------------------------------------------------------------+
int CLogify::SizeHandlers(void)
{
return(ArraySize(m_handlers));
}
//+------------------------------------------------------------------+
//| Initializes default settings |
//+------------------------------------------------------------------+
void CLogify::EnsureDefaultHandler()
{
//--- Check if there is no handler
if(this.SizeHandlers() == 0)
{
this.AddHandler(new CLogifyHandlerConsole());
this.AddHandler(new CLogifyHandlerComment());
}
}
//+------------------------------------------------------------------+
//| Generic method for adding logs |
//+------------------------------------------------------------------+
bool CLogify::Append(ENUM_LOG_LEVEL level,string msg, string origin = "", string args = "",string filename="",string function="",int line=0,int code_error=0)
{
//--- Ensures that there is at least one handler
this.EnsureDefaultHandler();
//--- Textual name of the log level
string levelStr = "";
switch(level)
{
case LOG_LEVEL_DEBUG: levelStr = "DEBUG"; break;
case LOG_LEVEL_INFO : levelStr = "INFO"; break;
case LOG_LEVEL_ALERT: levelStr = "ALERT"; break;
case LOG_LEVEL_ERROR: levelStr = "ERROR"; break;
case LOG_LEVEL_FATAL: levelStr = "FATAL"; break;
}
//--- Creating a log template with detailed information
datetime time_current = TimeCurrent();
MqlLogifyModel data("",levelStr,msg,args,time_current,time_current,level,origin,filename,function,line,m_error.Error(code_error));
//--- Supression
if(m_suppression.ShouldSuppress(data))
{
return(true);
}
//--- Call handlers
int size = this.SizeHandlers();
for(int i=0;i<size;i++)
{
data.formated = m_handlers[i].GetFormatter().Format(data);
m_handlers[i].Emit(data);
}
return(true);
}
//+------------------------------------------------------------------+
//| Debug level message |
//+------------------------------------------------------------------+
bool CLogify::Debug(string msg, string origin = "", string args = "",string filename="",string function="",int line=0)
{
return(this.Append(LOG_LEVEL_DEBUG,msg,origin,args,filename,function,line));
}
//+------------------------------------------------------------------+
//| Infor level message |
//+------------------------------------------------------------------+
bool CLogify::Info(string msg, string origin = "", string args = "",string filename="",string function="",int line=0)
{
return(this.Append(LOG_LEVEL_INFO,msg,origin,args,filename,function,line));
}
//+------------------------------------------------------------------+
//| Alert level message |
//+------------------------------------------------------------------+
bool CLogify::Alert(string msg, string origin = "", string args = "",string filename="",string function="",int line=0)
{
return(this.Append(LOG_LEVEL_ALERT,msg,origin,args,filename,function,line));
}
//+------------------------------------------------------------------+
//| Error level message |
//+------------------------------------------------------------------+
bool CLogify::Error(string msg, string origin = "", string args = "",string filename="",string function="",int line=0)
{
return(this.Append(LOG_LEVEL_ERROR,msg,origin,args,filename,function,line));
}
//+------------------------------------------------------------------+
//| Error level message |
//+------------------------------------------------------------------+
bool CLogify::Error(string msg, int code_error, string origin = "", string args = "",string filename="",string function="",int line=0)
{
return(this.Append(LOG_LEVEL_ERROR,msg,origin,args,filename,function,line,code_error));
}
//+------------------------------------------------------------------+
//| Fatal level message |
//+------------------------------------------------------------------+
bool CLogify::Fatal(string msg, string origin = "", string args = "",string filename="",string function="",int line=0)
{
return(this.Append(LOG_LEVEL_FATAL,msg,origin,args,filename,function,line));
}
//+------------------------------------------------------------------+
//| Fatal level message |
//+------------------------------------------------------------------+
bool CLogify::Fatal(string msg, int code_error, string origin = "", string args = "",string filename="",string function="",int line=0)
{
return(this.Append(LOG_LEVEL_FATAL,msg,origin,args,filename,function,line,code_error));
}
//+------------------------------------------------------------------+
//| Returns an instance of the builder |
//+------------------------------------------------------------------+
#include "LogifyBuilder.mqh"
CLogifyBuilder *CLogify::Create(void)
{
return(new CLogifyBuilder());
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CLogifySuppression *CLogify::Suppression(void)
{
return(m_suppression);
}
//+------------------------------------------------------------------+