Lazarus 日志工具 MultiLog

MultiLog是一种同时以灵活性和低开销为目标的日志系统。顾名思义,它可用于将日志实例到多个目标,如文本文件、可视控件或其余应用程序。添加新的日志目标使用两个方法就能够实现了,其中一个方法是可选的。
MultiLog一般相似于CodeSite、Smart Inect、Overseer和EstLogger,但它没有紧跟其中的任何一个,以不一样的方式实现了许多功能,甚至具备一些独特的功能。ide

image

目前(2019年5月)版本是v 0.6.0.0。spa

MultiLog的使用是极其简单的,如前面说的,仅仅两步就能够实现日志记录:debug

1:构建通道日志

2:输出code

通道能够是 IPCChannel,FileChannel,或可视控件,MultiLog预制了三个功能,直接使用便可,IPCChannel实现进程间辅助监视,利用例程View项目,便可实现跨进程Log监视orm

image

直接在中应用 MultiLog 单元,其定义了Logger全局实例。blog

image

若是要输出到某文件好比日期型号日志 “20190520.log”,进程

vLOGFileNameM  := FormatDateTime('yyyymmdd', Now);
vlogName       := vLOGFileNameM + '.log';
FFileChannel   := TFileChannel.Create(vlogName);
FFileLogHaneld := Logger.Channels.Add(FFileChannel);

这里对FileChannel作了点点调整,加入了固定的目录“Logs”。get

constructor TFileChannel.Create(const AFileName: string; ChannelOptions: TFileChannelOptions);
const
  logDir = 'Logs';
begin
  if not DirectoryExists(logDir) then
    ForceDirectories(logDir);
  FShowPrefix := fcoShowPrefix in ChannelOptions;
  FShowTime   := fcoShowTime in ChannelOptions;
  FShowHeader := fcoShowHeader in ChannelOptions;
  Active      := True;
  FFileName   := logDir + DirectorySeparator + AFileName;
end;

FileChannel.Create 还带一个ChannelOptions 参数,是个集合 ,默认是带[fcoShowHeader, fcoShowTime],若是要显示如故障、提示、警告须要加上fcoShowPrefix。string

with Logger do
  begin
    Channels.Add(LogTreeView1.Channel);
    Channels.Add(TIPCChannel.Create());
    Channels.Add(TFileChannel.Create('debug.log',[fcoShowHeader, fcoShowPrefix, fcoShowTime]));
    DefaultClasses := [lcDebug];
  end;

这也是MultiLog带了一个综合例子,Logger对Send作了多种overload,那么能够对Pascal语言的全部类型直接输出,包括TStringList,“状态”计数,SendError(’’)或者Send([lcError],’’),记录调用状况。

image

procedure TForm1.TestLogClick(Sender: TObject);
var
  AList:TStringList;
begin
  with Logger do
  begin
    ActiveClasses:=lcAll;
    EnterMethod(Sender,'TestLogClick');
    AList:=TStringList.Create;
    with AList do
    begin
      Add('aaaaaaa');
      Add('bbbbbbb');
      Add('ccccccc');
    end;
    Send('A Text Message');
    Send('Another Text Message');
    Send('A StringList', AList);
    AList.Destroy;
    SendError('A Error Message');
    SubLogClick(butSubLog);
    DefaultClasses := [lcWarning];
    ActiveClasses:=[lcDebug,lcInfo];
    Send('This Text Should NOT be logged');
    Send([lcDebug],'This Text Should be logged');
    ActiveClasses:=[];
    Send([lcWarning],'But This Text Should NOT');
    //Exitmethod is called even if not active if there's a unpaired EnterMethod
    ExitMethod(Sender,'TestLogClick');
    ActiveClasses:=lcAll;
  end;
end;

procedure TForm1.SubLogClick(Sender: TObject);
 var
   OldClasses: set of TDebugClass;
 begin
   with Logger do
   begin
     OldClasses:=ActiveClasses;
     ActiveClasses:=lcAll;
     EnterMethod(Sender,'SubLogClick');
     SendIf('Only show if called by TestLogClick',CalledBy('TestLogClick'));
     Send('AText inside DoIt');
     SendWarning('AWarning');
     SendCallStack('CallStack example');
     Send('A String','sadjfgadsfbmsandfb');
     Send('AInteger',4957);
     Send('A Boolean',True);
     ExitMethod(Sender,'SubLogClick');
     ActiveClasses:=OldClasses;
   end;
 end;


=== Log Session Started at 2019/5/12 9:19:41 by MultiLogDemo ===
09:19:45.201 >>ENTER METHOD: TButton(butTestLog).TestLogClick
09:19:45.205   INFO: A Text Message
09:19:45.209   INFO: Another Text Message
09:19:45.212   STRINGS: A StringList
                 aaaaaaa
                 bbbbbbb
                 ccccccc
09:19:45.215   ERROR: A Error Message
09:19:45.218   >>ENTER METHOD: TButton(butSubLog).SubLogClick
09:19:45.221     CONDITIONAL: Only show if called by TestLogClick
09:19:45.224     INFO: AText inside DoIt
09:19:45.227     WARNING: AWarning
09:19:45.336     CALL STACK: CallStack example
                     $000000010002DF2D line 329 of unit1.pas
                     $000000010002CF0F line 144 of unit1.pas
                     $0000000100126EF8 line 2913 of include/control.inc
                     $00000001001448FA line 55 of include/buttoncontrol.inc
                     $000000010014502F line 169 of include/buttons.inc
                     $00000001001447C2 line 21 of include/buttoncontrol.inc
                     $000000010000E1B5
                     $0000000100119B3C line 5419 of include/wincontrol.inc
                     $00000001001A9277 line 112 of lclmessageglue.pas
                     $00000001000FBEE8 line 2515 of win32/win32callback.inc
                     $00000001000FC6BC line 2677 of win32/win32callback.inc
                     $00000001001AEAFF line 105 of win32/win32pagecontrol.inc
                     $00007FFE5F37CA66
                     $0000000000090B9C
09:19:45.342     VALUE: A String = sadjfgadsfbmsandfb
09:19:45.346     VALUE: AInteger = 4957
09:19:45.349     VALUE: A Boolean = True
09:19:45.352   <<EXIT METHOD: TButton(butSubLog).SubLogClick
09:19:45.354   INFO: This Text Should be logged
09:19:45.356 <<EXIT METHOD: TButton(butTestLog).TestLogClick

经过监视进程MultiLog View监视到的数据,示例Log的输出。

image

是否是很方便!

相关文章
相关标签/搜索