Логирование в Delphi

Логирование (logging) — это ведение записей(как правило сохранение в файл) в хронологическом порядке.

Ведение логов зачастую очень удобная, облегчающая жизнь разработчику, штука, а для больших серьёзных проектов это вообще неотъемлемая вещь.

Логирование помогает как на этапе отладки, так и на этапе внедрения, например я прицеплял утилиту к проектам, которая отправляла файл лога куда мне удобно(сайт, мыло, сервер), таким образом избегал процесса вымогательства у пользователя лог-файла.

Я использую логирование почти во всех своих проектах от средне до велика.

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

Данный модуль можно так же применять в многопоточных приложениях.

Былина

За свою практику я переписал не мало разновидностей процессов логирования и каждый раз меня чутка тревожило ощущение, что «что-то тут осталось не таким удобным как мне хотелось бы» и от этого постоянно что-то дописывал/переписывал.

Так я пришёл от модуля, содержащего глобальные переменные — параметры лога и глобальную функцию типа WriteToLog(aMsg: string): boolean, к модулю с классом — менеджером логирования и методами записи на WinApi. Время дало мне возможность, так сказать, выбрать самый удобный вариант.

Во время улучшения менеджера логирования я встречал одну интересную реализацию в плане процесса записи:

  • единое открытие файла на всё время работы приложения;
  • запись по таймеру накопившейся очереди сообщений.

При этом для работы с файлом использовался какой-нить стрим, зачастую TFileStream. Но при таких раскладах у нас есть довольно большой риск «просеять» в логе сообщение именно про ту ошибку, которая и привела к краху проги из-за которой не дописался лог…

Парадоксальная неприятность)

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

Реализация

Я реализовал следующие элементы удобства:

  • единый класс логирования для всего приложения посредством шаблона Singleton;
  • типы сообщений (информация, предупреждение, ошибка);
  • уровень приоритета сообщений (максимальный, информативный, отладочный);
  • событийные типы как для объектных методов так и для обычных процедур;
  • настройка менеджера через свойства;
  • формирование заголовка из текущей даты и типа сообщения.

Код всего модуля uLogManager отображён в следующем листинге (Delphi 2007):

Как видно уровней важности сообщений и типов сообщений может быть сколько угодно. Потом можно взять какой-нить хороший текстовый редактор(например я юзаю PSPad) и настроить подсветку строк относительно типов сообщений или их уровней. Красота да и только)

Пример использования

Заключение

Реализация проходила в Delphi 2007.

Напомню, что шаблон Singleton я рассматривал вот в этой статье, где так же приведён исходный код модулей его реализации.