8.1 KiB
Logify
Logify is a logging library for MQL designed to simplify debugging, tracking, and monitoring of EAs and indicators. It provides structured, customizable, and organized logs directly on the chart or in the terminal, with support for log levels, flexible formats, and multiple handlers. A lightweight, elegant solution that is easy to integrate into your MQL projects.
📦 Features
- Multiple log levels: DEBUG, INFO, ALERT, ERROR, FATAL
- Display logs directly on graph, terminal, files or even database
- Customizable log format and layout
- Modular architecture with multiple handlers
- Lightweight and easy to integrate and use
🚀 Installation
You can install Logify in two ways:
Option 1: Git Clone (Recommended)
-
Clone the Logify repository in the terminal folder (Usually at
C:\Users\YOUR_USER\AppData\Roaming\MetaQuotes\Terminal\YOUR_ID\MQL5
):git clone https://forge.mql5.io/joaopedrodev/Logify
-
After cloning, you will have a new
MQL5/Logify
folder with the following structure:MQL5/Logify/ ├── Experts/ # Contains EA examples └── Include/ # Contains the Logify library
-
Copy the files to their respective folders:
- Copy the content from
MQL5/Logify/Experts
→MQL5/Experts
- Copy the content from
MQL5/Logify/Include
→MQL5/Include
- Copy the content from
-
Done! The library is installed and the examples are ready to use.
Option 2: Manual Download
- Download the code and copy the downloaded content to their respective folders:
- Copy the content from
59821/mql5/Logify/Experts
→MQL5/Experts
- Copy the content from
59821/mql5/Logify/Include
→MQL5/Include
- Copy the content from
Including in your project
After installation (by any of the options above), include Logify in your EA, indicator or script:
#include <Logify/Logify.mqh>
🔧 Quick Start Example
Simple example with default settings:
//+------------------------------------------------------------------+
//| Import |
//+------------------------------------------------------------------+
#include <Logify/Logify.mqh>
CLogify Logify;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Example logs
Logify.Debug("Initialization started");
Logify.Info("Account balance is OK");
Logify.Alert("Take profit reached");
Logify.Error("Failed to send order", "Order", "Reason: No money");
Logify.Fatal("Critical error: Invalid input parameters");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
Advanced example, with custom handler settings. In this example, we save the log record to files and in the graph comment. Customizing the settings for each of them.
//+------------------------------------------------------------------+
//| Import |
//+------------------------------------------------------------------+
#include <Logify/Logify.mqh>
CLogify Logify;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Configure comment handler
MqlLogifyHandleCommentConfig config_comment;
config_comment.size = 10;
config_comment.frame_style = LOG_FRAME_STYLE_SINGLE;
config_comment.direction = LOG_DIRECTION_UP;
config_comment.title = "My Expert";
//--- Create and configure comment handler
CLogifyHandlerComment *handler_comment = new CLogifyHandlerComment();
handler_comment.SetConfig(config_comment);
handler_comment.SetLevel(LOG_LEVEL_DEBUG);
handler_comment.SetFormatter(new CLogifyFormatter("{date_time} [{levelname}]: {msg}","hh:mm:ss"));
//--- Configure file handler
MqlLogifyHandleFileConfig file_config;
file_config.CreateDateRotationConfig("my_expert","logs",LOG_FILE_EXTENSION_LOG,10,100,CP_UTF8);
//--- Create and configure file handler
CLogifyHandlerFile *handler_file = new CLogifyHandlerFile();
handler_file.SetConfig(file_config);
handler_file.SetLevel(LOG_LEVEL_DEBUG);
handler_file.SetFormatter(new CLogifyFormatter("{date_time} [{levelname}]: {msg} ({filename} | {origin} | {function})","hh:mm:ss"));
//--- Attach handler
Logify.AddHandler(handler_comment);
Logify.AddHandler(handler_file);
//--- Example logs
Logify.Debug("Initialization started");
Logify.Info("Account balance is OK");
Logify.Alert("Take profit reached");
Logify.Error("Failed to send order", "Order", "Reason: No money");
Logify.Fatal("Critical error: Invalid input parameters");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
To understand each of the settings, I recommend reading the articles below, where I explain each step of the library development:
- Mastering Log Records (Part 1): Fundamental Concepts and First Steps in MQL5
- Mastering Log Records (Part 2): Formatting Logs
- Mastering Log Records (Part 3): Exploring Handlers to Save Logs
- Mastering Log Records (Part 4): Saving Logs to Files
- Mastering Log Records (Part 5): Optimizing the Handler with Cache and Rotation
- Mastering Log Records (Part 6): Saving Logs to Database
- Mastering Log Records (Part 7): How to Show Logs on Chart
- Mastering Log Records (Part 8): Error Records That Translate Themselves
- Mastering Log Records (Part 9): Implementing the builder pattern and adding default configurations
- Mastering Log Records (Part 10): Avoiding Log Replay by Implementing a Suppression
✔️ Log Levels
Level | Description |
---|---|
DEBUG | Verbose information for debug |
INFO | General information |
WARNING | Warnings or important events |
ERROR | Errors that require attention |
FATAL | Critical errors, stop execution |
🖥️ Handlers Included
Each handler defines where the logs will be displayed or stored.
Handler | Description |
---|---|
Comment | Display logs directly on the graph (Comment) |
Console | Show logs in MetaTrader terminal |
File | Save logs to .txt or .log files |
Database | Stores logs in local SQLite database |
You can use one or combine several handlers at the same time, like graphic + file + console, for example.
🛠️ Log Format
Example of formatting pattern:
"{date_time} [{levelname}]: {msg}"
Available tokens:
- {levelname}: Level name (DEBUG, INFO, ERROR, etc.)
- {msg}: Main message
- {args}: Additional arguments or details
- {timestamp}: Timestamp in seconds (Unix Time)
- {date_time}: Formatted date and time (hh:mm:ss, etc.)
- {level}: Numeric code for the level (0 = DEBUG, 1 = INFO...)
- {origin}: Origin or context defined in the log call
- {filename}: Source file name (if available)
- {function}: Name of the function from which it was called
- {line}: Line number in the code where the log occurred
⚖️ License
MIT License — Free to use for personal and commercial projects.
👨💻 Author
Developed by joaopedrodev, with a focus on making MQL development more professional, organized and efficient.