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. 使用11g DNFS建立基于DNFS的tablespace

    使用11g DNFS建立基于DNFS的tablespace 參考自: Step by Step - Configure Direct NFS Client (DNFS) on Linux (11g) ...

  2. FFmpeg的HEVC解码器源码简单分析:概述

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  3. 机器学习笔记——SVM

    SVM(Support Vector Machine).中文名为 支持向量机.就像自己主动机一样.听起来异常神气.最初总是纠结于不是机器怎么能叫"机",后来才知道事实上此处的&qu ...

  4. 【Hibernate学习】 ——ORM(一)

    Hibernate是一种能实现ORM的框架. ORM即Object Relational Mapping.对象关系映射.也就是将关系数据库中表的数据映射成为对象.也就是说将表与表之间的操作映射成对象与 ...

  5. HDU 4352 XHXJ&#39;s LIS(数位dp&amp;状态压缩)

    题目链接:[kuangbin带你飞]专题十五 数位DP B - XHXJ's LIS 题意 给定区间.求出有多少个数满足最长上升子序列(将数看作字符串)的长度为k. 思路 一个数的上升子序列最大长度为 ...

  6. JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法

    首先要注册百度地图API. 1.登录百度地图开放平台http://lbsyun.baidu.com 注册账号,完善信息,点击网站右上角的“API控制台”,点击,创建应用. 应用类型选择:“浏览器端”, ...

  7. 公钥加密,摘要算法MD5,SSH相关概念

    1.公钥加密,又叫非对称加密,一般指的是用一组密钥来保证通信的安全.(公钥,私钥)成对存在且惟一,典型的公钥算法有 RSA(计算出的是1024位,128字节),顺便提一下与公钥加密算法相对应的就是传统 ...

  8. codeforces 965E Trie+multiset

    E. Short Code time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. MySQL-day1数据库的安装与介绍

    一.mysql的安装步骤 以5.7.20版本为例: 第1步: 第2步: 第3步: 第4步: 第5步: 第6步: 第7步: 第8步: 第9步: 第10步: 第11步: 第12步: 第13步: 第14步: ...

  10. Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1

    转自:http://blog.51cto.com/alinazh/1276363 在启动tomcat的时候出现错误: Line: 220 - com/opensymphony/xwork2/sprin ...