пятница, 3 мая 2013 г.

MultiLog: компоненты логирования в Lazarus


Мне нужно реализовать систему логирования. Обратил свой взор к системе MultiLog.
http://wiki.lazarus.freepascal.org/MultiLog
https://luipack.bountysource.com/wiki/multilog

Мне нужно выводить лог в файл и требуется организовать уровни логирования. То есть иметь возможность включать и отключать логирование для различных частей программы.

Не хочется реализовывать велосипед. Попробую разобраться в этих компонентах.
Для начала нужно создать каналы, куда будут сохраняться логи. В моем случае это файловый канал.
Logger.Channels.Add(TFileChannel.Create('logfile.txt'));

В файле проекта .lpr в секцию uses добавил модули SharedLogger, filechannel.
В секции begin end добавил строчку:

begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  
  Logger.Channels.Add(TFileChannel.Create('logfile.txt')); 
  
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.  

Когда мы подключаем модуль SharedLogger у нас автоматически создается класс Logger. С ним мы и будем работать.

Пробую отправку сообщения в лог.
Logger.Send('Тестовое сообщение');

Создался файл, там же где и программа. Содержимое файла такое:
11:56:30:581 INFO: Тестовое сообщение

Нужно добавить дату к времени. И видимо ошибка в библиотеке, так как новый запуск программы не отделяет лог от предыдущего.
Соответственно вношу изменения в модуль filechannel библиотеки.
Ищу строку: constructor TFileChannel.Create(const AFileName: String);
В конструктор вставляю строку   FShowHeader := True;
Теперь у меня выглядит так:

constructor TFileChannel.Create(const AFileName: String);
begin
  FShowHeader := True;
  FShowPrefix := True;
  FShowTime := True;
  FShowStrings := True;
  Active := True;
  FFileName := AFileName;
end;

Это будет выводиться разделитель логов.

Теперь делаем дату.
В методах UpdateIdentation и Deliver есть преобразование формата из времени в строку.
Заменим строку форматирования 'hh:nn:ss:zzz' на 'dd.mm.yy hh:nn:ss:zzz'.
Вот собственно и всё.

Еще несколько слов о том как выводить в лог. Нужно задать какие уровни логирования будут выводиться в лог. Делается это так:
Logger.ActiveClasses:=[0,1,2];

При отправке в лог мы задаем соответствующий уровень:
Logger.Send([2],'Тест');
Кстати, можно задать несколько уровней:
Logger.Send([2,0],'Тест');
Если вы не зададите уровень, то он будет поставлен по умолчанию - 0.
Это можно задать свойством:
Logger.DefaultClasses:=[1];

Интересной кажется возможность выводить целые классы:
Logger.Send([1],Self);

Можно выводить Исключения:
try
  1/0
except
on E: Exception do
  Logger.SendException([1],'Исключение',E); 
end;

Можно выводить стек:
Logger.MaxStackCount:=10; 
Logger.SendCallStack([1],'Текущий стек');  

Можно выводить вход и выход из метода : EnterMethod, ExitMethod.

Там ещё есть интересное, но разбираться с остальным я пока не буду. Читайте исходники.

Комментариев нет:

Отправить комментарий