당사 팬 페이지에 가입하십시오
- 조회수:
- 106
- 평가:
- 게시됨:
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
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
로트 크기와 손절매에 따라 위험을 동적으로 계산하는 지표(백분율 및 금액)를 제공합니다.
확률론적 사이버 사이클
적응형 스토캐스틱 오실레이터입니다.
일일 범위 예측 전체
현재 차트의 모든 막대에 대해 다음 일일 캔들의 변동 범위를 예측합니다.
주기 기간
이 지표의 목적은 금융 자산의 가격 변동 과정의 주기성을 측정하는 것입니다. 주기 표시기의 도움으로 적응형 버전의 오실레이터를 만들 수 있습니다.