MultiLog是一种同时以灵活性和低开销为目标的日志系统。顾名思义,它可用于将日志实例到多个目标,如文本文件、可视控件或其他应用程序。添加新的日志目标使用两个方法就可以实现了,其中一个方法是可选的。

MultiLog通常类似于CodeSite、Smart Inect、Overseer和EstLogger,但它没有紧跟其中的任何一个,以不同的方式实现了许多功能,甚至具有一些独特的功能。

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

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

1:构建通道

2:输出

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

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

如果要输出到某文件比如日期型号日志 “20190520.log”,

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

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

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。

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],’’),记录调用情况。

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的输出。

是不是很方便!

Lazarus 日志工具 MultiLog的更多相关文章

  1. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  2. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  3. Java主流日志工具库

    在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...

  4. 【工具推荐】ELMAH——可插拔错误日志工具

    今天看到一篇文章(构建ASP.NET网站十大必备工具(2)),里面介绍了一个ELMAH的错误日志工具,于是研究了一下. ELMAH 是 Error Logging Modules and Handle ...

  5. Android-LogCat日志工具(二)

    既然是Java语言,那么对于很多人来说,用System.out.println() 方法来打印日志是最熟悉.最简单不过了.不过在真正的项目开发中,是极度不建议使用 System.out.println ...

  6. Android-LogCat日志工具(一)

    LogCat : Android中一个命令行工具,可以用于得到程序的log信息. 就像你知道一个人的日志.航程,你可以无时无刻知道一个人在干什么. 而LogCat , 就是程序的日志.通过日志,你可以 ...

  7. Java 标准日志工具 Log4j 的使用(附源代码)

    源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还 ...

  8. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  9. Android中日志工具的使用

    添加LogCat到你的Eclipse日志在任何项目的开发过程中都会起到非常重要的作用,在Android项目中如果你想要查看日志则必须要使用LogCat工具.当你第一次在Eclipse中运行Androi ...

随机推荐

  1. HDU - 3584 Cube (三维树状数组 + 区间改动 + 单点求值)

    HDU - 3584 Cube Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Subm ...

  2. yarn之安装依赖包

    安装依赖关系 yarn install用于安装项目的所有依赖项.依赖关系从您的项目package.json文件中检索,并存储在yarn.lock文件中. 开发包时,安装依赖关系最常见的是在 您刚刚检出 ...

  3. 本地调用jni之VC++无法导入问题

    事实上非常easy,无法导入头文件就自己新建呗 1. 首先编写java代码 class Vrv { public native void printVersion(); static { System ...

  4. SDUST 2844-Mineral Water(数学)

    Mineral Water nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit1000ms Memory Limi ...

  5. 十分简便的APK反编译(Mac 版本号 具体解释)

    之前參考了网上大神们介绍的apk for mac  的反编译的文章,里面写的十分具体而有用,可是因为apk for mac中反编译细节十分繁琐,过程也相对照较复杂,针对这个缺陷本人对其反编译的过程进行 ...

  6. POJ2653 Pick-up sticks 判断线段相交

    POJ2653 判断线段相交的方法 先判断直线是否相交 再判断点是否在线段上 复杂度是常数的 题目保证最后答案小于1000 故从后往前尝试用后面的线段 "压"前面的线段 排除不可能 ...

  7. CodeForces 124C Prime Permutation (数论+贪心)

    题意:给定一个字符串,问你能不能通过重排,使得任意一个素数p <= 字符串长度n,并且 任意的 i <= 长度n/素数p,满足s[p] == s[p*i]. 析:很容易能够看出来,只要是某 ...

  8. source命令用法(转载)

    转自:http://zhidao.baidu.com/link?url=mNfsPHSjTEm7llgyMYx0UVNwkJmD_cxLeHtZnHcM6Ms8LDXofVHka_EzHi6GltbR ...

  9. bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序【置换群】

    至今都不知道置换群是个什么东西--题解说什么就是什么.jpg 以下来自hzwer:http://hzwer.com/3905.html #include<iostream> #includ ...

  10. 设计模式 | 组合模式(composite)

    定义: 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 结构:(书中图,侵删) 一个Component接口:定义统一的方法 若干树枝(Com ...