Как программно получить логи наименьшими усилиями?

 

Коллеги, подскажите, как прочитать из советника логи с закладки Эксперты или Журнал?

Не хочется извлекать текст из SysListView, хочется более элегантного решения.

Может, есть команда "сброс логов на диск" и ее можно отправить терминалу?

У кого какие мысли есть? 

 
Andrey Khatimlianskii:

Коллеги, подскажите, как прочитать из советника логи с закладки Эксперты или Журнал?

Не хочется извлекать текст из SysListView, хочется более элегантного решения.

Может, есть команда "сброс логов на диск" и ее можно отправить терминалу?

У кого какие мысли есть? 

   правый клик в окне терминала, и выбор команды "смотреть" приводит к сбросу логов в файл
 

Если логи будет читать сторонняя программа, то способ принудительного сброса лога - закрытие терминала ))) Потом сразу же открываем терминал.

Если программа основана на MQL и работает внутри терминала, то нужно исследовать, какое сообщение посылается, когда вызываем "Открыть" из контекстного меню журнала. Ведь именно так происходит сброс данных на HDD без закрытия терминала. Но такая возможность - недокументированная и придется с каждым новым билдом проверять, не изменилось ли там чего.

 
Rustamzhan Salidzhanov:
   правый клик в окне терминала, и выбор команды "смотреть" приводит к сбросу логов в файл
Я в курсе )
Спрашиваю про конкретный код. Может, кто знает
 
Игорь Герасько:

Если логи будет читать сторонняя программа, то способ принудительного сброса лога - закрытие терминала ))) Потом сразу же открываем терминал.

Если программа основана на MQL и работает внутри терминала, то нужно исследовать, какое сообщение посылается, когда вызываем "Открыть" из контекстного меню журнала. Ведь именно так происходит сброс данных на HDD без закрытия терминала. Но такая возможность - недокументированная и придется с каждым новым билдом проверять, не изменилось ли там чего.

Это нужно в советнике, закрытие не подходит (да и долгое оно, не вариант).

Если никто не подскажет, буду исследовать команды. 

 
Andrey Khatimlianskii:

Если никто не подскажет, буду исследовать команды. 

Звучит, как угроза)) Но кто сказал, что мы испугаемся угроз?

Ну а если серьезно, то, на мой взгляд, это наиболее оптимальный вариант. Читать ListCtrl - проблемнее, т. к. там, скорее всего, двойной буфер используется.

 
да там все несложно, был когда то скрипт , или советник для реконнекта, который делает практически те же самые движения, только целевое окно ему переназначить. в кодбейзе лежал
 

1. если кто-то пишет во вкладку "Эксперты", то наверное этот кто-то может писать параллельно то же самое в конкретный файл

2. учитывая непреодолимое стремление МК к песочницам и безопасности, врядли есть стандартный способ получить данные из папки, которая частью песочницы не является, а потому рискну предположить, что единственный способ прочитать системные логи - это из DLL читать *.log файлы отсюда - https://www.metatrader5.com/ru/terminal/help/start_advanced/structure

 

Лично я все трассировочные сообщения вывожу с помощью макросов TRACE(), которые для DEBUG варианта разворачиваются в функцию (для RELEASE все зависит от установленных разрешений):

void PerformTrace(string strValue,string strFunc,string strLine)
{
   if(FUNCTIONSIG4TRACE !="" && strFunc != FUNCTIONSIG4TRACE)
      return;

   if(TRACE_PERMITION != true)
      return;
 
   uint uiCurTickCounter = GetTickCount();
  
   if(bDenyOftenTrace == true && uiCurTickCounter - uiGlobalTickCounter < TRACEMINTIME)
      return;
  
   uiGlobalTickCounter = uiCurTickCounter;
 
   string strRes;
  
   if(TRACEFUNCTIONSIG == 1)
      #ifdef __MQL5__
         StringConcatenate(strRes,strFunc,", line ",strLine,": ",strValue);
      #else  
         strRes = StringConcatenate(strFunc,", line ",strLine,": ",strValue);
      #endif  
   else
      strRes = strValue;
  
   if(TRACEREPEAT == 0)
      {
      if(strLastMessage == strValue)
         {
         ++uiNumOfPassedMessages;
         return;
         };
     
      if(uiNumOfPassedMessages > 0)
         {
         strRes = "(ВНИМАНИЕ !!! Пропущено одинаковых предыдущих сообщений: " + IntegerToString(uiNumOfPassedMessages) + "); " + strRes ;
         uiNumOfPassedMessages = 0;
         };

      strLastMessage = strValue;
      };              

   switch(TRACEMODE)
      {
      case 0:
         return;
     
      case 1:
         Print(strRes);
         return;
     
      case 2:  
         CLogFile::GlobalLogString(strRes,"MyTrace.log");
         return;


      case 3:  
         MessageBox(strRes,"TRACE Message");
         return;

      case 4:  
         Print(strRes);
         MessageBox(strRes,"TRACE Message");
         return;

      case 5:
         Print(strRes);
         CLogFile::GlobalLogString(strRes,"MyTrace.log");
         return;

      case 6:
         Print(strRes);
         CLogFile::GlobalLogString(strRes,"MyTrace.log");
         CComment::GlobalCommentString(strRes);
         return;
        
      default:
         break;
      }
};


Определяя параметр TRACEMODE - можно выводить все сообщения так, как надо, и если эти сообщения будут потом использоваться - я их вывожу в отдельный файл, который потом читается в необходимом месте.

Кроме того, там есть дополнительные параметры, с помощью которого можно задавать режимы работы частых трейсов или вобще их запретить.

Таким образом, обеспечивается гибкий вывод сообщений так, как необходимо, или вобще выключение всякого вывода.

 
artemiusgreat:

1. если кто-то пишет во вкладку "Эксперты", то наверное этот кто-то может писать параллельно то же самое в конкретный файл

2. учитывая непреодолимое стремление МК к песочницам и безопасности, врядли есть стандартный способ получить данные из папки, которая частью песочницы не является, а потому рискну предположить, что единственный способ прочитать системные логи - это из DLL читать *.log файлы отсюда - https://www.metatrader5.com/ru/terminal/help/start_advanced/structure

1. Спасибо, кэп)

Если бы надо было читать свои записи, вопроса бы не возникло

2. Понятно, что это будет dll, вопрос в том  - какая.

 
George Merts:

Лично я все трассировочные сообщения вывожу с помощью макросов TRACE(), которые для DEBUG варианта разворачиваются в функцию (для RELEASE все зависит от установленных разрешений):

Таким образом, обеспечивается гибкий вывод сообщений так, как необходимо, или вобще выключение всякого вывода.

Спасибо, конечно, но задача заключается в другом. 
Причина обращения: