Lazarus 日志工具 MultiLog
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的更多相关文章
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- Java主流日志工具库
在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...
- 【工具推荐】ELMAH——可插拔错误日志工具
今天看到一篇文章(构建ASP.NET网站十大必备工具(2)),里面介绍了一个ELMAH的错误日志工具,于是研究了一下. ELMAH 是 Error Logging Modules and Handle ...
- Android-LogCat日志工具(二)
既然是Java语言,那么对于很多人来说,用System.out.println() 方法来打印日志是最熟悉.最简单不过了.不过在真正的项目开发中,是极度不建议使用 System.out.println ...
- Android-LogCat日志工具(一)
LogCat : Android中一个命令行工具,可以用于得到程序的log信息. 就像你知道一个人的日志.航程,你可以无时无刻知道一个人在干什么. 而LogCat , 就是程序的日志.通过日志,你可以 ...
- Java 标准日志工具 Log4j 的使用(附源代码)
源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还 ...
- Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- Android中日志工具的使用
添加LogCat到你的Eclipse日志在任何项目的开发过程中都会起到非常重要的作用,在Android项目中如果你想要查看日志则必须要使用LogCat工具.当你第一次在Eclipse中运行Androi ...
随机推荐
- HDU - 3584 Cube (三维树状数组 + 区间改动 + 单点求值)
HDU - 3584 Cube Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Subm ...
- yarn之安装依赖包
安装依赖关系 yarn install用于安装项目的所有依赖项.依赖关系从您的项目package.json文件中检索,并存储在yarn.lock文件中. 开发包时,安装依赖关系最常见的是在 您刚刚检出 ...
- 本地调用jni之VC++无法导入问题
事实上非常easy,无法导入头文件就自己新建呗 1. 首先编写java代码 class Vrv { public native void printVersion(); static { System ...
- SDUST 2844-Mineral Water(数学)
Mineral Water nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit1000ms Memory Limi ...
- 十分简便的APK反编译(Mac 版本号 具体解释)
之前參考了网上大神们介绍的apk for mac 的反编译的文章,里面写的十分具体而有用,可是因为apk for mac中反编译细节十分繁琐,过程也相对照较复杂,针对这个缺陷本人对其反编译的过程进行 ...
- POJ2653 Pick-up sticks 判断线段相交
POJ2653 判断线段相交的方法 先判断直线是否相交 再判断点是否在线段上 复杂度是常数的 题目保证最后答案小于1000 故从后往前尝试用后面的线段 "压"前面的线段 排除不可能 ...
- CodeForces 124C Prime Permutation (数论+贪心)
题意:给定一个字符串,问你能不能通过重排,使得任意一个素数p <= 字符串长度n,并且 任意的 i <= 长度n/素数p,满足s[p] == s[p*i]. 析:很容易能够看出来,只要是某 ...
- source命令用法(转载)
转自:http://zhidao.baidu.com/link?url=mNfsPHSjTEm7llgyMYx0UVNwkJmD_cxLeHtZnHcM6Ms8LDXofVHka_EzHi6GltbR ...
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序【置换群】
至今都不知道置换群是个什么东西--题解说什么就是什么.jpg 以下来自hzwer:http://hzwer.com/3905.html #include<iostream> #includ ...
- 设计模式 | 组合模式(composite)
定义: 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 结构:(书中图,侵删) 一个Component接口:定义统一的方法 若干树枝(Com ...