Мне нужно реализовать систему логирования. Обратил свой взор к системе 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.
Там ещё есть интересное, но разбираться с остальным я пока не буду. Читайте исходники.
Комментариев нет:
Отправить комментарий