Журналирование или логирование в Delphi XE3
Передо мной возник вопрос, как логировать то, что происходит в программе в Delphi XE3. Причём мне нужно отписывать происходящие события не только в файл, но и в базу данных. Кроме того я хочу отписывать сообщения из двух приложений в один файл параллельно, т.е. из разных процессов. Поскольку за Delphi я не садился с далёкого 2000-го года, мне пришлось закатать рукава и заняться поисками, что появилось с тех давних времён.
Журналирование с помощью CodeSite
Изобретать велосипед и писать, что-то с нуля можно, но не очень хочется. Поэтому первое, что я посмотрел, это, а что есть в Delphi XE3 из коробки. Оказалось, что в комплект входит инструмент под названием CodeSite Express, т.е. урезанная версия CodeSite. Покупать я ничего не собирался и начал разбираться с экспресс-версией.
Для начала нужно – это подключить юнит CodeSiteLogging, и можно пользоваться методами глобального объекта CodeSite. Например, записать сообщение в лог:
При выполнении вышеприведённого кода автоматически всплывает окошко программы CodeSite Live Viewer с нашим сообщением.
Кроме того есть ещё много перегруженных вариантов функции Send. Например, можно записать сразу весь объект в журнал:
После этого вы сможете просмотреть все свойства объекта в момент записи в окне CodeSite Live Viewer на панели Inspector Pane, чтобы её открыть, нажмите на F11.
Режим работы CodeSite в которой вы сразу видите результат, это так называемый Live Logging. Теперь разберёмся с тем, как записывать журнал в файл, чтобы позже можно было анализировать его. Это делается так:
После выполнения этого кода окно CodeSite Live Viewer появляться не будет, зато в папке с исполняемым файлом создастся файл Log.csl, в котором будут содержаться все наши сообщения. Чтобы посмотреть этот файл просто откройте его в программе CodeSite Live Viewer.
Журналирование с помощью log4delphi или log4d
Здесь нужно пару слов сказать про систему логирования от Apache. Библиотеки log4… обладают широчайшими возможностями, они бесплатны, документированы и имеют открытые исходные коды. Журналы можно записывать в файл, в базу данных, в консоль (если у вас консольное приложение), отправлять сообщения командой netsend (для Windows) или на SMTP-сервер. Кроме того можно использовать фильтры и шаблоны сообщений.
Немного поискав в Интернете выяснилось, что есть две параллельные разработки log4delphi и log4d. Когда я начал скачивать исходники и бинарники библиотеки log4delphi (http://sourceforge.net/projects/log4delphi/files/log4delphi/), выяснилось, что последнее обновление библиотеки было 16.11.2010г. Для библиотеки log4d ещё более худшая ситуация: последние изменения файлов в архиве датируются от 11.06.2007, хотя последнее обновление архива стоит 29.04.2013. Ну, если они старые, это не значит, что плохие. Будем проверять.
Журналирование с помощью log4delphi
Теперь давайте разберёмся, что может и чего не может эта библиотека. Сразу начну с ложки дёгтя: библиотека log4delphi не поддерживает загрузку конфигурации из xml файла. Конфигурацию можно загружать из ini-файла или настраивать программно. Запись в базу данных происходит сразу, без буфферизации, плюс в SQL-запросе должны быть определённые параметры, а это неудобно. Кроме того не поддерживается запись сообщений в файл журнала из разных процессов (только монопольное владение файлом) и мало регулярных выражений для шаблонов. Всё это выяснилось при анализе исходного кода.
Но может быть кому-нибудь эта библиотека понравится. Здесь поддерживается запись сообщений в базу данных (посредством BDE, SqlExpr, InterBase Express) и в файл. Есть возможности формирования лога в виде обычного текстового файла, HTML-документа, XML-файла.
Журналирование с помощью log4d
Кроме того пришлось дополнить функцию TLogCustomLayout.Init:
И пришлось выкинуть из проекта файл Log4DNM.pas, т.к. компонентов NM… (а именно компонента TNMSMTP) теперь нет в Delphi. Это не страшно, т.к. есть юнит Log4DIndy.pas, который выполняет те же функции (отправляет сообщения на SMTP-сервер), только с помощью компонента TIdSMTP, который сразу поставляется вместе с Delphi XE3.
Также в юните Log4DXML.pas пришлось по-другому подключить библиотеку MSXML:
В этом же юните пришлось убрать два варианта функции _Set_documentLocator. После этого проект скомпилировался.
Теперь о возможностях этой библиотеки. Здесь нет возможности записи сообщений в базу данных и также не возможна запись сообщений в файл из разных процессов, зато есть вывод сообщений в дебаггер и есть отправка сообщений SMTP-серверу. Поддерживается загрузка конфигурации из XML-документа и из ini-файла. Есть возможности формирования обычного текстового файла и HTML-документа.
Не смотря на то, что в этой библиотеки нет записи в базу данных, эта библиотека мне понравилась больше. По своей внутренней структуре она ближе к log4j и log4net. Поэтому я решил остановиться на этой библиотеке и дописать те куски, которых мне не хватает.
В результате, после моих правок, библиотека log4d умеет записывать сообщений в базу данных посредством ADO-компонентов (юнит Log4DDB.pas) с возможностью буферизации (если кому то не нравится ADO, можете по аналогии дописать свой обработчик сообщений, используя желаемые компоненты), позволяет записывать сообщения в файл из разных процессов, причём допускаются разные привилегии. Также я добавил возможность подставлять в сообщения название приложения, имя текущего пользователя и имя компьютера, с помощью шаблона (класс TLogPatternLayout).
Версию библиотеки log4d с моими правками вы можете скачать здесь:
log4d Версия:от 30.06.2019 ![]() | |
25.01.2014 42.75 KB 2009 | |
Теперь пару слов о том, как работать с библиотекой. Для начала библиотеку нужно сконфигурировать. Например, загрузить конфигурацию их xml-файла:
А вот и пример файла конфигурации (здесь указано, что сообщения будут переданы в хранимую процедуру SaveLogMessage и будут сохранены в текстовый файл App.log):
Можно сконфигурировать библиотеку log4d программно:
После того как библиотека сконфигурирована, можно писать сообщения:
Файл лога получится в данном примере примерно такой:
Вы так же можете поиграться с фильтрами, например, записывать ошибки в один файл, а остальные сообщения не записывать вообще или записывать в другой файл и т.п. В общем, вам решать, что и как использовать для логирования. Желаю успехов.
Обзор инструмента CodeSite в Delphi
После выхода RAD Studio XE в составе меню “Tools” появился ещё один инструмент для разработчика – CodeSite. Что такое CodeSite? Это система журналирования (logging system), которая позволяет вести удобный и, главное, максимально информативный лог работы приложения. Думаю, что когда-либо перед любым разработчиком встает вопрос о том, каким образом отслеживать работу своего продукта, как на этапе его разработки, так и после релиза, когда программой во всю используют другие люди. Соответственно, до RAD Studio XE, многие могли начать изобретать свой собственный “велосипед” – “движок для логирования” собственного производства. Может быть такой подход и оправдан в какой-то мере, но всё-таки имеет много недостатоков, например:
В принципе, эти два недостатка и сподвигли меня уделить пару часиков своего времени на то, чтобы изучить работу инструмента CodeSite. Так как сейчас приходится успевать работать над двумя проектами, то тратить время на “велосипеды” совсем не хочется, тем более, что под рукой уже есть замечательное и эффективное решение от профессионалов.
Введение
Итак, что же такого интересного может предложить нам CodeSite?

Для просмотра логов мы можем использовать:
Кроме того, в состав CodeSite входит небольшая консольная утилита под названием CSFileExporter.exe, с помощью которой можно экспортировать лог-файл в другие форматы – XML, CSV, TSV.
От слов к делу. Посмотрим как работает CodeSite и, что мы можем сделать, используя бесплатную версию инструмента – CodeSite Express.
Первый лог с CodeSite. Использование класса TCodeSiteLogger.
Класс TCodeSiteLogger используется для отправки сообщений из программы в диспетчер CodeSite для дальнейшего их просмотра в одном из viewer’ов. Собственно, для нас этот класс будет основным. Класс содержится в модуле CodeSiteLogging, который необходимо подключить в uses того модуля работу которого мы будем логировать. Для наиболее общего использования возможностей этого класса от нас не требуется создавать собственные объекты, т.к. при инициализации модуля уже создается объект CodeSite: TCodeSiteLogger, который можно сразу же использовать. Однако никто нам и не запрещает сделать хоть 10 собственных объектов и работать с ними.
Для начала рассмотрим те методы класса, без которых лог – не лог. И первый метод:
Метод Send отправляет новое сообщение в логгер. Этот метод имеет несколько перегруженных вариантов, если быть точнее, то в CodeSite 5 (для Delphi XE2) содержится 39 вариантов метода Send, которые позволяют отправлять различные данные в логгер в их нативном формате. Например, следующий перегруженный метод:
Позволяет отправить сообщение, содержащее целиком весь объект формы. Другие варианты Send позволяют отправлять строки, числа, списки строк, картинки, иконки и т.д. В общем преобразования типов данных внутри кода программы нам вряд ли понадобится.
Для примера работы метода Send создадим новый проект Delphi, подключим в uses модуль CodeSiteLogging, бросим на форму кнопку и напишем на OnClick такой код:
Теперь запустите программу и нажмите кнопку. Сразу же после нажатия кнопки запуститься Live Viewer, содержащий наши сообщения:
Как видите, то сообщение, для которого мы назначили иконку ошибки, выглядит иначе, чем два предыдущих сообщения. И надо сказать, что использование иконок – это конечно, мелочь, но эта мелочь очень неплохо повышает читабельность лога. Ведь согласитесь, что при просмотре лога первое, куда перемещается взгляд – на запись, которая выглядит “не так”? И тут главное не переборщить, чтоб лог не выглядел как новогодняя елка, иначе вся наглядность пойдет прахом.
Двигаемся далее по методам. Следующий метод:
Этот метод проверяет выражение, записанное в Expression и, если оно равно False отправляет в логгер сообщение типа “Ошибка”. На примере нашего приложения работу этого метода можно продемонстрировать так:
Если высота окна будет больше ширины – в лог выведется строка, сообщающая нам об этом, иначе – сообщение об ошибке будет пропущено. Кстати, раз уж речь пошла про сообщения об ошибках и исключениях, то у TCodeSiteLogger для таких целей есть сразу два метода:
Эти методы по части количества перегруженных версий не такие богатые как Send (всего по две версии), но зато сразу отправляют сообщение с необходимыми иконками. Перегруженные версии позволяют использовать в сообщениях шаблоны строк (аналогично CreateFmt у Exception). Сообщения, отправленные с помощью методов SendError и SendExceprion в Live Viewer выглядят следующим образом:
Следующие два метода позволяют нам записать в лог вход/выход из метода:
Использовать их можно так:
В этом случае мы получим вот такой лог работы программы:
Либо воспользоваться перегруженными версиями этих методов и передать в сообщении какой-нибудь объект:
В этом случае перед названием метода, которое мы передали во втором параметре также выведется и название объекта, т.е. лог будет выглядеть так:
Использование двух этих методов могут преследовать сразу две полезные задачи. Во-первых, использование Enter/ExitMethod повышает наглядность лога – в большом подробном логе сразу будет видно в каком методе что происходит. Во-вторых, используя функции viewer’а мы можем сворачивать все сообщения, находящиеся между блоками и, тем самым, быстро находить необходимую нам информацию в логе.
Вот, пожалуй, те методы, которые будут очень полезны и востребованы при логгировании работы программы. Это не все методы, которые имеются у класса TCodeSiteLogger. Есть так же и менее важные методы, например,
которые ещё больше повышают наглядность лога, но, не передают никакой информации о работе. Поэтому, если хотите, можете немного поэкспериментировать с различными методами класса и посмотреть, что в итоге получите в логе. А мы перейдем к следующей части статьи и рассмотрим свойства класса TCodeSiteLogger.
Свойства TCodeSiteLogger
Свойств у TCodeSiteLogger не много и все они, за исключением двух используются для повышения наглядности удобства чтения лога:
Что касается первых пяти свойств, то тут лучше показать как они работают, чем рассказывать. Например, с помощью свойств Category, CategoryColor можно создать вот такой лог:
Обратите внимание – при использовании свойства Category мы получили не только то, что каждое сообщение в логе содержит строку в столбце Category, но также и разделение всего лога по вкладкам, где каждая вкладка содержит сообщения отдельной категории.
Свойство Destination используется для того, чтобы указать объекту где и как будут обрабатываться сообщения. Ниже будет показан пример того, как, используя свойство Destination можно записывать лог в отдельный файл. Например, мы можем создать несколько объектов для ведения лога и каждому из них назначить свою категорию, одному задать через Destination запись лога в файл, второму в Live Viewer и т.д.
Запись лога в файл
Когда мы разрабатываем программу, то, как уже было сказано выше, наиболее удобно и комфортно использовать возможности Live Viewer’а. Однако, когда программа уже разошлась по пользователям, то для ведения лога работы программы этот просмотрщик логов уже не подойдет – надо будет писать лог в файл. Для чтения лога из файла предназначен второй viewer – File Viewer. Как заставить его работать?
Во-первых, нам надо “сказать” логгеру (TCodeSiteLogger), что данные будут записываться в файл. Делается это следующим образом:
1. Создаем, например, на OnCreate формы объект типа TCodeSiteDestination и для него следующие свойства:
Таким образом мы указали, что лог будет содержаться в файле “Log.csl”, который будет расположен в директории с программой. Теперь определим свойство Destination у CodeSite и запустим программу:
Можете закрыть Live Viewer, т.к. обновляться он не будет, а вместо этого открыть директорию с программой и убедиться, что по мере работы программы файл лога постепенно наполняется данными. В последствии, полученный лог можно будет открыть в File Viewer или добавить содержимое файла в Live Viewer.
При записи в файл Вы также можете указать ограничения на файл – максимальный размер в байтах или максимальное количество записей.
С записью в файл тоже вроде бы разобрались. Теперь более внимательно посмотрим на окно Viewer’а.
Работа с Live/File Viewer
Что касается работы с вьюверами, то тут, дума, для описания всех функций и возможностей даже в “урезанной” поставке CodeSite с RAD Studio XE2 не хватит ни сил не времени. Да и это, в принципе, незачем. Поэтому расскажу лишь про те функции, которые для меня сейчас наиболее полезны.
И первая функция – это сворачивание/разворачивание лога работы в отдельно методе. Как я уже говорил выше, для того, чтобы разграничить в логе места где выполняется како-либо код используются методы EnterMethod и ExitMethod. Для того, чтобы свернуть весь лог, находящийся между записями типа “вход/выход из метода” необходимо нажать Ctrl+Up или в выбрать в логе запись входа в метод и в контекстном меню нажать “Collapse Method“. Повторное нажатие Ctrl+Up развернет лог между метками входа/выхода. На рисунке ниже показан лог в котором часть сообщение “свернута”:

На представленном выше рисунке Вы можете видеть, что в лог записывалась информация по объекту формы (Self). Если мы выберем в логе любую запись с этим объектом то в панели инспектора (справа) отобразятся все значения свойств этого объекта в момент отправки сообщения, т.е. инспектор будет выглядеть так:


Вот пожалуй очень кратко о том, что за инструмент CodeSite и как им пользоваться. В заключение скажу, что после того как разобрался с работой CodeSite пожалел, что не использовал его ранее – инструмент очень даже неплохой, даже учитывая то, что это всего лишь Express-версия без таких “плюшек”, как просмотр коллекция ScratchPad и т.д. По крайней мере, используя его для логирования работы программы для работы с Google Docs (а там и сетевые подключения и потоков куча) я не нашел к чему бы придраться. В общем, если Вам срочно нужна хорошая система логирования – используйте CodeSite.
RAD Studio 10
RAD Studio – это программная среда, позволяющая пользователям на языках Object Pascal и C++ создавать, развертывать и обновлять приложения в самый быстрый способ за счет использования облачных сервисов. Это идеальный вариант для тех, кому необходимо написать визуально красивую программу, способную работать с распределенными системами и интенсивно обмениваться данными.
Разработка приложений
Кроссплатформенная среда разработки RAD Studio позволяет создать проект для ОС Windows, Mac и мобильных устройств. Это универсальный инструмент, с помощью которого Вы можно писать приложения на языках Object Pascal и C++.
VCL или библиотека визуальных компонентов RAD Studio — это набор из более двухсот элементов для проектирования Windows интерфейса, которые помогут сделать приложения более изысканными и удобными, а также усовершенствовать и упрощать взаимодействие пользователей с ОС Windows. VCL позволяет быстро проектировать привлекательные интерфейсы, которые отвечают всем современным требованиям к программам для Windows 10.
GetIt
Диспетчер библиотек GetIt созданный для удобного и быстрого поиска, загрузки и обновления компонентов, библиотек и других ресурсов программной среды по категориям.
BeaconFence
BeaconFence (маячки) — это разработка RAD Studio для решения задачи точного мониторинга объектов без использования GPS. Маячки также предоставляют поддержку событий, связанных с отслеживанием в радиальных и геометрических зонах практически любой структуры.
CodeSite Express
RAD Studio предоставляет пользователю вести журналирование, которое реализуется непосредственно через инструмент CodeSite. Данная разработка позволяет использовать в процессе написания программы и ее отладки информативный лог работы написанного кода.
CodeSite дает пользователю полное понимание того, как выполняется написанный ним код. Для этого необходимо просто добавить в проект нужный Viewer. В состав инструмента CodeSite также входит консольная утилита — CSFileExporter.exe, которая позволяет экспортировать файл лога приложения в другие форматы удобные для разработчика форматы, например, XML, CSV, TSV.
Стоит заметить, что можно использовать два вида Viewer — Live (его удобно использовать на этапе разработки приложения, так как он обновляется сразу после поступления новых сообщений в диспетчер сообщений) и File (собственно, сам просмотрщик файлов логирования, который можно отфильтровать по интересующим разработчика критериям)
Преимущества RAD Studio:
Недостатки RAD Studio:
РАД Студио — это достаточно удобная среда для кроссплатформенного программирования. Она содержит весь необходимый инструментарий для создания высокопродуктивных приложений под ОС Windows, Mac, а также мобильные устройства (Android, IOS) и позволяет вести быструю нативную разработку за счет подключения облачных сервисов.



log4d Версия:от 30.06.2019 
25.01.2014
42.75 KB
2009









