Difference between revisions of "LazLogger/ru"

From Lazarus wiki
Jump to navigationJump to search
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{MenuTranslate|page=LazLogger}}
+
{{LanguageBar}}
  
 
__TOC__
 
__TOC__
Line 33: Line 33:
 
=== Вывод логирования ===
 
=== Вывод логирования ===
 
==== Stdout (Стандартный вывод) ====
 
==== Stdout (Стандартный вывод) ====
В нормальных условиях выходные данные записываются в <code>stdout</code>. Выходные данные не записываются, если <code>stdout</code> закрыт - например, когда приложение имеет вид {$AppType Gui} или скомпилировано с -WG в Windows (см. Compiler options(Параметры компилятора) / Linking(Связывание) / Target OS specific options(Параметры, специфичные для целевой ОС)).
+
В нормальных условиях выходные данные записываются в <code>stdout</code>. Выходные данные не записываются, если <code>stdout</code> закрыт - например, когда приложение имеет вид {$AppType Gui} или скомпилировано с -WG в Windows (см. Projct Options/Compiler options(Параметры компилятора) /Config and Target (Настройка и целевая платформа)/Target-specific options(Частные параметры цели)).
  
 
==== Файл ====
 
==== Файл ====
Line 87: Line 87:
 
Вы также можете написать свой собственный класс логгера и использовать его с LazLogger/Base.
 
Вы также можете написать свой собственный класс логгера и использовать его с LazLogger/Base.
  
== Multithreading ==
+
== Многопоточность ==
  
* '''DebugLn''' is thread safe, since Lazarus 2.0.  
+
* '''DebugLn''' потокобезопасен, начиная с Lazarus 2.0.  
: Earlier versions of this text stated "since 1.0", but a further race condition was found and fixed for 2.0.
+
: В более ранних версиях этого текста было указано «начиная с 1., но было найдено и исправлено еще одно условие для 2.0.
  
* Calls to '''DbgOut''', '''DebugLnEnter''', '''DebugLnExit''' can be made from threads, but may not always format/indent the output correctly.
+
* Вызовы '''DbgOut''', '''DebugLnEnter''', '''DebugLnExit''' могут быть сделаны из потоков, но не всегда могут правильно форматировать/делать отступ в выходных данных.
  
* The creation/setup/destruction/configuration of the logger is [[not]] thread-save, and should be done before threads are started.
+
* Создание/настройка/уничтожение/конфигурирование логгера - это <b>НЕпотокобезопасные</b> операции и должны быть сделаны до запуска потоков.
: Creation is usually done automatically during unit initialization.
+
: Создание обычно выполняется автоматически во время инициализации устройства.
: But any properties (eg ParamForLogFileName) should be set before accessing the logger from threads.
+
: Но любые свойства (например, ParamForLogFileName) должны быть установлены до доступа к логгеру из потоков.
  
* Callback to events like OnDebugLn are made in each thread. The code in the callback must be thread save by itself.
+
* Обратный вызов для таких событий, как OnDebugLn, производится в каждом потоке. Код в обратном вызове должен быть сам по себе потокобезопасным.
: Changing the property is NOT thread-save
+
: Изменение свойства является <b>НЕпотокобезопасным</b>
  
== See also ==
+
== См.также ==
* [[doc:fcl/eventlog/teventlog.html|TEventLog documentation]] Built in support for logging in FPC/Lazarus
+
* [[doc:fcl/eventlog/teventlog.html|TEventLog documentation]] Встроенная поддержка входа в FPC/Lazarus
* [[DebugServer]] Allows sending log entries to a viewer via IPC
+
* [[DebugServer]] Позволяет отправлять записи журнала наблюдателю через IPC
 
* [[MultiLog]]
 
* [[MultiLog]]
 
* [[log4delphi]]
 
* [[log4delphi]]
* The package IdeLazLogger, which adds a dialog to the IDE allowing to enable/disable log groups used in the IDE itself.
+
* Пакет IdeLazLogger, который добавляет в IDE диалог, позволяющий включать/отключать группы журналов, используемые в самой IDE.
  
[[Category:LCL]]
+
[[Category:LCL/ru]]
[[Category:Lazarus]]
+
[[Category:Lazarus/ru]]
[[Category:Debugging]]
+
[[Category:Debugging/ru]]
 
[[Category:Logging]]
 
[[Category:Logging]]
 +
{{AutoCategory}}

Latest revision as of 16:46, 8 January 2022

English (en) русский (ru)

Обзор

Модуль LazLogger поставляется с Lazarus и обеспечивает ведение журнала в файл.

Использование

Добавление поддержки логирования в ваш исходный код

(По историческим причинам некоторые части также доступны через LclProc (удалено, начиная с Lazarus 1.10); этот доступ может быть удален в будущем)

Просто подключив модуль lazlogger, вы сможете использовать следующее:

  • DebugLn: который работает примерно так же, как WriteLn.
  • DebugLnEnter/DebugLnExit: так же, как debugln, но с отступом увеличить/уменьшить.
  • DbgOut: который работает примерно так же, как Write.

Все они могут быть вызваны с помощью:

  • Одной строки или списка (до 15) строк: DebugLn('Foo'); DbgOut('a','b');
  • Массива констант: DebugLn(['Foo=', 1, ' Bar=', anInteger]);
  • Тех же аргументов, что и Format(). String + array of const: DbgOut('a %d',[1]);

Также есть множество функций dbgs, которые преобразуют общие типы в строку. Например, dbgs(aRect) преобразует переменную типа TRect в строку.

Активация/Деактивация LazLogger при помощи использования правильного модуля

LazLogger предоставляет 3 модуля для использования в разделе "uses"

LazLogger
Используйте этот модуль только в вашей основной программе. Использование этих модулей активирует функционирование LazLogger.
LazLoggerBase
Используйте этот модуль, когда вы хотите использовать debugln. То, что делает LazLoggerBase, зависит от того, используется ли модуль LazLogger в каком-либо другом модуле вашего приложения. Если модуль LazLogger не используется, LazLoggerBase установит «логгер черной дыры», который отбросит все сообщения журнала. Если LazLogger используется где-либо, то все устройства, использующие LazLoggerBase, будут записывать сообщения журнала, как описано в разделе «Вывод логирования»
LazLoggerDummy
Этот модуль предоставляет вам фиктивные вызовы debugln (и всех других функций LazLagger). Это просто вызовы пустых методов. Это позволяет отключить все журналы в модуле, без необходимости удалять любой оператор debugln.

Вывод логирования

Stdout (Стандартный вывод)

В нормальных условиях выходные данные записываются в stdout. Выходные данные не записываются, если stdout закрыт - например, когда приложение имеет вид {$AppType Gui} или скомпилировано с -WG в Windows (см. Projct Options/Compiler options(Параметры компилятора) /Config and Target (Настройка и целевая платформа)/Target-specific options(Частные параметры цели)).

Файл

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

  • проверяет параметры командной строки вашей программы на --debug-log=<file> (в Lazarus: Run(Запуск) / Run Parameters(Параметры запуска) / Command line parameters(Параметры командной строки) - на вкладка "Локальные"). При нахождении этого параметра любые последующие выходные данные отладки отправляются в <file>.
Имя параметра можно изменить с помощью DebugLogger.ParamForLogFileName:'--debug-log'; Это свойство существует, только если используется модуль LazLogger. (LazLoggerBase не определяет это свойство).
  • Если параметр командной строки '--debug-log' не задан, он затем проверяет, существует ли переменная среды операционной системы xxx_debuglog, где xxx - имя файла программы без расширения. Например, для Lazarus это будет lazarus_debuglog. Если такая переменная среды существует, она использует файл, указанный в этой переменной среды, в качестве файла для получения отладочной информации.

Пример: если вы cделаете:

set lazarus_debuglog=c:\lazarus\debug.txt

и запустите Lazarus, вывод данных отладки будет записан в c:\lazarus\debug.txt.

Сервер отладки

Недоступно в LazLogger; см. DebugServer.

Группы журналов

Вы можете добавить группы журналов.

var MY_LOG_GROUP: PLazLoggerLogGroup; 

initialization
  MY_LOG_GROUP := DebugLogger.FindOrRegisterLogGroup('fancy_name_for_mylog' {$IFDEF MY_LOG_GROUP_ON_BY_DEFAULT} , True {$ENDIF} );

В вашем коде используйте

debugln(MY_LOG_GROUP, 'log this text');
debugln(MY_LOG_GROUP, ['a=',a,' b=',b]); // a, b должны быть базовыми типами: integer, byte, ansistring. Смотрите типы, доступные для "array of const"

и чтобы включить его, вызовите ваше приложение с

--debug-enable=fancy_name_for_mylog

--debug-enable= принимает список [значений, разделенных] запятой

Уже активированную группу (DebugLogger.FindOrRegisterLogGroup('grpname', True)) можно отключить, указав имя группы со знаком минус.

--debug-enable=-fancy_name_for_mylog

Имя параметра может быть установлено через DebugLogger.ParamForEnabledLogGroups='--debug-enable';

Документация

Для получения дополнительной информации см. сам модуль и документацию LCL.

Используя LazLogger/LazLoggerBase, ваш код может получить доступ к экземпляру DebugLogger. Это предлагает некоторые свойства для точной настройки логирования.

Вы также можете написать свой собственный класс логгера и использовать его с LazLogger/Base.

Многопоточность

  • DebugLn потокобезопасен, начиная с Lazarus 2.0.
В более ранних версиях этого текста было указано «начиная с 1.0», но было найдено и исправлено еще одно условие для 2.0.
  • Вызовы DbgOut, DebugLnEnter, DebugLnExit могут быть сделаны из потоков, но не всегда могут правильно форматировать/делать отступ в выходных данных.
  • Создание/настройка/уничтожение/конфигурирование логгера - это НЕпотокобезопасные операции и должны быть сделаны до запуска потоков.
Создание обычно выполняется автоматически во время инициализации устройства.
Но любые свойства (например, ParamForLogFileName) должны быть установлены до доступа к логгеру из потоков.
  • Обратный вызов для таких событий, как OnDebugLn, производится в каждом потоке. Код в обратном вызове должен быть сам по себе потокобезопасным.
Изменение свойства является НЕпотокобезопасным

См.также

  • TEventLog documentation Встроенная поддержка входа в FPC/Lazarus
  • DebugServer Позволяет отправлять записи журнала наблюдателю через IPC
  • MultiLog
  • log4delphi
  • Пакет IdeLazLogger, который добавляет в IDE диалог, позволяющий включать/отключать группы журналов, используемые в самой IDE.