거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Telegram에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
라이브러리

Logging V2 for both MQL4 and MQL5 - MetaTrader 5용 라이브러리

조회수:
106
평가:
(5)
게시됨:
\MQL5\Include\
Logging.mqh (52.65 KB) 조회
\MQL5\Experts\ \MQL5\Scripts\
Logging.mq5 (9.08 KB) 조회
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

CDebugLogger 클래스 V2: MQL4/5를 위한 포괄적인 로깅 유틸리티

CDebugLogger 클래스는 MQL4/5 환경을 위해 특별히 설계된 강력하고 유연한 로깅 유틸리티입니다. 애플리케이션의 동작을 정밀하게 모니터링, 디버그 및 추적해야 하는 개발자에게 필수적인 도구입니다.

이번 새 버전의 CDebugLogger 클래스에서는 기능과 활용성을 향상시키기 위해 몇 가지 개선 사항을 도입했습니다. 이러한 개선 사항에는 OnTick, OnTimer, OnChartEvent와 같은 이벤트 기반 시스템에서 과도한 로깅을 방지하는 디바운스 메커니즘과 개발자가 가장 관련성이 높은 로그 항목에 집중할 수 있는 새로운 필터링 및 무음 옵션이 포함됩니다.

사용자가 자신의 필요에 가장 적합한 구현을 자유롭게 선택할 수 있도록 이 업데이트 버전을 별도의 코드베이스로 출시하기로 결정했습니다. 기존 버전을 선호하든 이 향상된 버전을 선호하든, 이제 워크플로와 프로젝트 요구 사항에 맞는 로깅 도구를 선택할 수 있습니다.

아래에서 이 향상된 클래스의 주요 특징과 기능을 살펴보세요.

주요 기능

  • 다중 로그 레벨: CDebugLogger 클래스는 정보, 경고, 오류, 디버그 등 다양한 수준의 중요도에 따른 로깅을 지원합니다. 이를 통해 개발자는 특정 중요도가 높은 메시지를 필터링하고 집중할 수 있습니다.
  • 타임스탬프 포함: 개발자는 사용자 지정 가능한 형식으로 로그 메시지에 타임스탬프를 포함하도록 선택할 수 있습니다. 이 기능은 이벤트의 정확한 시간을 추적하고 시간에 민감한 문제를 디버깅하는 데 매우 중요합니다.
  • 파일 로깅: 이 클래스는 파일 로깅에 대한 강력한 지원을 제공합니다. 개발자는 파일 로깅을 활성화 또는 비활성화하고, 로그 파일의 경로를 지정하고, 로그를 일반 폴더에 저장할지 여부를 선택할 수 있습니다. 또한 로그를 CSV 형식으로 저장할 수 있어 구문 분석 및 분석이 용이합니다.
  • 컨텍스트 정보: 로그 메시지의 명확성을 높이기 위해 CDebugLogger 클래스를 사용하면 함수 서명, 파일 이름 및 줄 번호를 포함할 수 있습니다. 이 컨텍스트 정보는 코드 내에서 문제의 정확한 위치를 파악하는 데 도움이 됩니다.
  • 자동 키워드: 이 클래스의 고유한 기능은 특정 키워드가 포함된 로그를 무음 처리하는 기능입니다. 이 기능은 비밀번호나 기밀 데이터와 같은 민감한 정보가 기록되는 것을 방지하는 데 특히 유용합니다.
  • 키워드 필터링: 클래스의 또 다른 고유한 기능은 특정 키워드가 포함된 로그를 필터링하는 기능입니다. 이 기능은 특정 문제와 관련된 로그에만 집중하여 디버깅할 특히 유용합니다. 개발자는 특정 용어가 포함된 메시지만 포함하도록 로그 출력 범위를 좁힐 수 있으므로 관련 없는 로그 항목에 압도되지 않고 해당 용어와 관련된 문제를 쉽게 식별하고 해결할 수 있습니다.
  • 이벤트에 대한 디바운스 로깅: 로그 스팸 및 이벤트 기반 시스템(예: OnTick, OnTimer, OnChartEvent)의 과도한 로깅을 방지하기 위해 CDebugLogger 클래스에는 디바운싱 메커니즘이 포함되어 있습니다. 이 기능을 사용하면 동일한 이벤트에서 반복되는 로그 항목이 일시적으로 억제되어 고유하거나 중요한 변경 사항만 기록할 수 있습니다. 이 기능은 로그의 노이즈를 줄이고 이벤트 발생 빈도가 높은 환경에서 성능 저하를 방지하는 데 특히 유용합니다.

사용 예

다음은 CDebugLogger 클래스를 초기화하고 사용하는 방법의 예시입니다:

// 파일에 INFO 레벨 로깅으로 로거 초기화하기
CDebugLogger logger(INFO, true, "log.txt", true, TIME_DATE | TIME_MINUTES, false, true, true, true);

// 간단한 메시지 기록
logger.Log(INFO, "This is an info message");

// 키워드 뮤트하기
logger.AddSilentKeyword("password");

// 무음 처리할 메시지 기록
logger.Log(INFO, "User entered password: 1234");

// 파일 로깅 활성화
logger.EnableFileLogging(true, "debug.log", false);

// 음소거된 키워드 제거
logger.RemoveSilentKeyword("password");

// 뮤트 목록에서 키워드를 제거한 후 메시지 기록하기
logger.Log(INFO, "User entered password: 1234");

// 로그 필터링에 키워드 추가
logger.AddFilterKeyword("success");

// 필터링할 메시지를 기록합니다.
logger.Log(INFO, "Operation failed");

// 필터를 통과할 메시지를 기록합니다.
logger.Log(INFO, "Operation successful");

// 필터에서 키워드 제거
logger.RemoveFilterKeyword("success");

// 일반 Log 함수를 사용하여 초기화하기
logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true);

// 일반 Log 함수를 사용하여 경고 기록하기
Log(WARNING, "This is a warning message");

스크립트 예제

스크립트에서 CDebugLogger 클래스를 활용하려면 아래 그림과 같이 파일 시작 부분에 필요한 라이브러리를 포함하기만 하면 됩니다:

//--- 이 헤더 파일을 다른 모든 헤더 파일보다 먼저 포함시키는 것이 중요합니다.
#include <Logging.mqh>  


//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수|
//+------------------------------------------------------------------+
void OnStart()
{
   //--- INFO 레벨로 로거를 초기화하여 파일에 로깅합니다.
   //--- 타임스탬프 포함 및 CSV 형식으로 저장하기
   int log_options = 0; // 파일명 | 줄 | 함수;
   logging.Initialize(INFO, true, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, true);

   //--- 간단한 정보 메시지 기록
   Log(INFO, "Script started successfully.");

   //--- 경고 메시지 기록
   Log(WARNING, "This is a warning message.");

   //--- 오류 메시지 기록
   Log(ERROR, "This is an error message.");

   //--- 디버그 메시지 로그
   Log(DEBUG, "This is a debug message for debugging purposes.");

   //--- 'password'가 포함된 무음 로그에 키워드 추가
   logging.AddSilentKeyword("password");

   //--- 음소거 키워드가 포함된 메시지를 기록하려고 시도합니다.
   Log(INFO, "User entered password: 12348"); // 이 메시지는 음소거됩니다.

   //--- 음소거 키워드 제거
   logging.RemoveSilentKeyword("password");

   //--- 메시지를 다시 기록하면 이제 기록됩니다.
   Log(INFO, "User entered password: 1234");

   //--- 일반 Log 함수를 사용하여 메시지를 기록합니다.
   Log(INFO, "This message is logged using the generic Log function.");

   //--- 인쇄 매크로를 사용하여 INFO 수준에서 메시지를 기록합니다.
   Print("This message is logged using the Print macro.");

   //--- 다양한 옵션 조합으로 로깅 데모 시연하기
   logging.Initialize(INFO, true, "log_with_options.txt", true, TIME_DATE | TIME_MINUTES, false, FILENAME | LINE, true);
   Log(INFO, "This log includes only the file name and line number.");

   logging.Initialize(INFO, true, "log_with_funcsig.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, FUNCSIG, true);
   Log(INFO, "This log includes only the function signature.");

   logging.Initialize(INFO, true, "log_custom_order.txt", true, TIME_MINUTES, false, LINE | FILENAME | FUNCSIG, true);
   Log(INFO, "This log includes line number, file name, and function signature in a custom order.");

   //--- '중요'가 포함된 로그를 필터링할 키워드를 추가합니다.
   logging.AddFilterKeyword("important");

   //--- 필터 데모를 위해 몇 가지 메시지를 기록합니다.
   Log(INFO, "This is an important message."); // 이 메시지가 표시됩니다.
   Log(INFO, "This is a regular message.");    // 이 메시지는 표시되지 않습니다.

   //--- 모든 로그를 표시하려면 필터 키워드를 제거합니다.
   logging.RemoveFilterKeyword("important");

   //--- 스크립트의 끝을 나타내는 마지막 메시지를 기록합니다.
   Log(INFO, "Script execution completed.");
}

출력 CSV 예제:

Timestamp,Level,Message
"2024.09.01 18:31:44","INFO","Script started successfully."
"2024.09.01 18:31:44","WARNING","This is a warning message."
"2024.09.01 18:31:44","ERROR","This is an error message."
"2024.09.01 18:31:44","DEBUG","This is a debug message for debugging purposes."
"2024.09.01 18:31:44","INFO","User entered password: 1234"
"2024.09.01 18:31:44","INFO","This message is logged using the generic Log function."
"2024.09.01 18:31:44","INFO","This message is logged using the Print macro."
Timestamp,Level,Message,Filename,Line
"2024.09.01 18:31","INFO","This log includes only the file name and line number.","Logging.mq5","135"
Timestamp,Level,Message,Funcsig
"2024.09.01 18:31:44","INFO","This log includes only the function signature.","void OnStart()"
Timestamp,Level,Message,Filename,Line,Funcsig
"18:31","INFO","This log includes line number, file name, and function signature in a custom order.","Logging.mq5","141","void OnStart()"
"18:31","INFO","This is an important message.","Logging.mq5","147","void OnStart()"
"18:31","INFO","Script execution completed.","Logging.mq5","154","void OnStart()"


익스퍼 어드바이저 예제

#include <Logging.mqh>

//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
int OnInit()
{  int log_options = LINE | FUNCSIG; // FILENAME | LINE | FUNCSIG; 또는 0
   logging.Initialize(INFO, false, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, false);
//--- 타이머 생성
   EventSetMillisecondTimer(1);
//---
   return(INIT_SUCCEEDED); }
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- 파괴 타이머
   EventKillTimer(); }

int counter = 0;
datetime last_time = 0; //--- 카운터가 마지막으로 업데이트된 시간을 저장합니다.
//+------------------------------------------------------------------+
//| 타이머 기능|
//+------------------------------------------------------------------+
void OnTimer()
{  logging.BeginEvent(); //--- 새 이벤트 시작
   Log(INFO, "Sample message");
   Log(INFO, "Another message");
   Log(INFO, "Sample message"); 
//--- 현재 시간 가져오기
   datetime current_time = TimeLocal();
//--- 카운터가 마지막으로 업데이트된 후 2초 이상 경과했는지 확인합니다.
   if (current_time - last_time >= 2)
   {  //--- 카운터 업데이트
      counter++;
      //--- 마지막 업데이트
      last_time = current_time;
      //--- 새 카운터 값으로 메시지를 기록합니다.
      Log(INFO, "Counter value: " + IntegerToString(counter));
      //--- 다른 메시지를 기록할 수도 있습니다.
      Log(INFO, "Updated after 2 seconds"); }
   else
   {  //--- 타이머가 활성화되었지만 카운터가 변경되지 않았음을 나타내는 메시지를 기록합니다.
      Log(INFO, "Timer active but counter unchanged"); } }

출력 MT5 터미널 예제:

2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 43 Function: void OnTimer() [INFO] Sample message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 44 Function: void OnTimer() [INFO] Another message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 45 Function: void OnTimer() [INFO] Sample message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 55 Function: void OnTimer() [INFO] Counter value: 1
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:29.605 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
2024.09.22 13:00:31.001 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 55 Function: void OnTimer() [INFO] Counter value: 2
2024.09.22 13:00:31.001 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:31.017 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
2024.09.22 13:00:33.001 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 55 Function: void OnTimer() [INFO] Counter value: 3
2024.09.22 13:00:33.001 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:33.016 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged


결론

CDebugLogger 클래스는 모든 MQL4/5 개발자에게 매우 유용한 도구입니다. 사용자 정의 가능한 다양한 기능을 통해 애플리케이션의 정확한 로깅과 모니터링을 가능하게 하여 디버깅을 더 쉽게 하고 애플리케이션 성능을 더 잘 추적할 수 있습니다. 간단한 메시지 로깅이 필요하든 자세한 컨텍스트 정보가 필요하든, CDebugLogger 클래스는 개발 요구 사항에 맞는 안정적이고 효율적인 솔루션을 제공합니다.

CDebugLogger 클래스에 대한 자세한 내용을 보거나 다른 고급 도구 및 솔루션을 살펴보려면 StormWave Technologies를 방문하세요.

MetaQuotes Ltd에서 영어로 번역함.
원본 코드: https://www.mql5.com/en/code/52298

Position Risk Calculation Tool Position Risk Calculation Tool

로트 크기와 손절매에 따라 위험을 동적으로 계산하는 지표(백분율 및 금액)를 제공합니다.

확률론적 사이버 사이클 확률론적 사이버 사이클

적응형 스토캐스틱 오실레이터입니다.

일일 범위 예측 전체 일일 범위 예측 전체

현재 차트의 모든 막대에 대해 다음 일일 캔들의 변동 범위를 예측합니다.

주기 기간 주기 기간

이 지표의 목적은 금융 자산의 가격 변동 과정의 주기성을 측정하는 것입니다. 주기 표시기의 도움으로 적응형 버전의 오실레이터를 만들 수 있습니다.