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 ...
随机推荐
- 使用11g DNFS建立基于DNFS的tablespace
使用11g DNFS建立基于DNFS的tablespace 參考自: Step by Step - Configure Direct NFS Client (DNFS) on Linux (11g) ...
- FFmpeg的HEVC解码器源码简单分析:概述
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- 机器学习笔记——SVM
SVM(Support Vector Machine).中文名为 支持向量机.就像自己主动机一样.听起来异常神气.最初总是纠结于不是机器怎么能叫"机",后来才知道事实上此处的&qu ...
- 【Hibernate学习】 ——ORM(一)
Hibernate是一种能实现ORM的框架. ORM即Object Relational Mapping.对象关系映射.也就是将关系数据库中表的数据映射成为对象.也就是说将表与表之间的操作映射成对象与 ...
- HDU 4352 XHXJ's LIS(数位dp&状态压缩)
题目链接:[kuangbin带你飞]专题十五 数位DP B - XHXJ's LIS 题意 给定区间.求出有多少个数满足最长上升子序列(将数看作字符串)的长度为k. 思路 一个数的上升子序列最大长度为 ...
- JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法
首先要注册百度地图API. 1.登录百度地图开放平台http://lbsyun.baidu.com 注册账号,完善信息,点击网站右上角的“API控制台”,点击,创建应用. 应用类型选择:“浏览器端”, ...
- 公钥加密,摘要算法MD5,SSH相关概念
1.公钥加密,又叫非对称加密,一般指的是用一组密钥来保证通信的安全.(公钥,私钥)成对存在且惟一,典型的公钥算法有 RSA(计算出的是1024位,128字节),顺便提一下与公钥加密算法相对应的就是传统 ...
- codeforces 965E Trie+multiset
E. Short Code time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- MySQL-day1数据库的安装与介绍
一.mysql的安装步骤 以5.7.20版本为例: 第1步: 第2步: 第3步: 第4步: 第5步: 第6步: 第7步: 第8步: 第9步: 第10步: 第11步: 第12步: 第13步: 第14步: ...
- Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
转自:http://blog.51cto.com/alinazh/1276363 在启动tomcat的时候出现错误: Line: 220 - com/opensymphony/xwork2/sprin ...