kbmMWLog日志框架,针对不同的业务情况,提供了多种日志管理器:

  • TkbmMWStreamLogManager
  • TkbmMWLocalFileLogManager
  • TkbmMWSystemLogManager
  • TkbmMWStringsLogManager
  • TkbmMWProxyLogManager
  • TkbmMWTeeLogManager
  • TkbmMWNullLogManager

这些日志管理器,针对不同的日志输出对象而实现,比如将日志输出到文件、TStrings,Stream、系统控制台等。

那如果想同时输出日志到多种对象怎么办呢?例如:想用文件记录日志的同时,也想输出到系统控制台以及界面上的Memo控件,在调试时能直接看到日志内容。非常幸运,作者已经为我们考虑到并完美实现,那就是用上面日志管理器TkbmMWTeeLogManager。直接看代码:

procedure TForm1.Button5Click(Sender: TObject);
var
filelogmgr:IkbmMWLocalFileLogManager;
systemlogmgr:IkbmMWSystemLogManager;
teelogmgr:IkbmMWTeeLogManager;
stringslogmgr:TkbmMWStringsLogManager;
begin
// 准备三个日志管理器 (系统及本地文件及Strings)
// 然后定义一个tee日志管理器,并将系统及本地文件日志管理器传给tee日志管理器
filelogmgr:=TkbmMWLocalFileLogManager.Create('.\log.txt','.\audit.txt');
filelogmgr.FileOptions:=[mwlfoDeleteOldLog,mwlfoDeleteOldAudit];
systemlogmgr:=TkbmMWSystemLogManager.Create;
//用Memo显示日志
stringslogmgr:=TkbmMWStringsLogManager.Create(Memo1.Lines);
//定义一个tee日志管理器,让日志信息传递给另外两个日志管理器
teelogmgr:=TkbmMWTeeLogManager.Create(filelogmgr,systemlogmgr,stringslogmgr);
Log.LogManager:=teelogmgr; //忽略指定的异常,不记录到日志
Log.LogManager.IgnoreException(EMyException);
end;

这是从作者提供的Demo中拿来并进一步完善的代码,先建立文件日志管理器filelogmrg,系统日志管理器systemlogmgr,然后再建一个teelogmgr,将filelogmrg,systemlogmgr作为tee日志管理器的Create方法的参数,同时传给teelogmgr对象,最后将teelogmgr设置为全局对象Log的管理器。我做了补充,让日志同时显示到Memo控件上,因为又加了StringsLogManager管理器。

现在日志就同时输出到文件及系统及控件Memo这三个日志管理器对象中去了。可以分别对这三个日志管理器做进一步的设置,例如,在文件日志中记录所有类型的日志,而在Memo中只显示Debug,Error,Fatal类型的日志,用下面代码设置:

stringslogmgr.LogTypeFilter:=[mwltDebug,{mwltInfo,mwltWarning,}mwltError,mwltFatal{,mwltAudit}];

kbmMWLog同时输出日志到多个日志管理器的更多相关文章

  1. python的日志模块:logging;django的日志系统;django日志输出时间修改

    Django的log,主要是复用Python标准库中的logging模块,在settings.py中进行配置 源代码 1.__init__.py包含以下类: StreamHandler Formatt ...

  2. [日志] spring boot + logback 日志输出配置

    一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...

  3. Spark日志,及设置日志输出级别

    Spark日志,及设置日志输出级别 1.全局应用设置 2.局部应用设置日志输出级别 3.Spark log4j.properties配置详解与实例(摘录于铭霏的记事本) 文章内容来源: 作者:大葱拌豆 ...

  4. Linux命令nohup实现命令后台运行并输出到或记录到日志文件

    Linux命令nohup实现命令后台运行并输出到或记录到日志文件 导读 我们在调试程序的时候,免不了要去抓一些 log ,然后进行分析.如果 log 量不是很大的话,那很简单,只需简单的复制粘贴就好. ...

  5. KBMMW 的日志管理器

    kbmmw 4.82 最大的新特性就是增加了 日志管理器. 新的日志管理器实现了不同类型的日志.断言.异常处理.计时等功能. 首先.引用kbmMWLog.pas 单元后,系统就默认生成一个IkbmMW ...

  6. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  7. 机器数据的价值 - Web 访问日志和数据库审计日志

    计算机数据 大量的数据流,不断增长的来源,蕴含着巨大的价值 在 Splunk,我们大量谈及计算机数据.这些数据是指在数据中心.“物联网”和互联设备世界中运行的所有系统产生的数据.其中包括支撑组织的应用 ...

  8. iOS应用日志:开始编写日志组件与异常日志

    应用日志(一):开始编写日志组件 对于那些做后端开发的工程师来说,看 LOG解Bug应该是理所当然的事,但我接触到的移动应用开发的工程师里面,很多人并没有这个意识,查Bug时总是一遍一遍的试图重现,试 ...

  9. mysql之 日志体系(错误日志、查询日志、二进制日志、事务日志、中继日志)

    一. mysql错误日志:错误日志记录的事件:a).服务器启动关闭过程中的信息b).服务器运行过程中的错误信息c).事件调试器运行一个事件时间生的信息d).在从服务器上启动从服务器进程时产生的信息lo ...

随机推荐

  1. C# string 字符串详解 恒定 驻留

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨.这篇文章共四节,来讲 ...

  2. CF-517B-DP

    http://codeforces.com/contest/1072/problem/B 给出两个数列 a,b 长度为n-1 ,询问是否能构造出一个长度为n的数列t,使得 所有的ab都满足  a[i] ...

  3. Ping 的TTL理解

    http://www.webkaka.com/tutorial/zhanzhang/2017/061570/ 根据自己的扩展重新整理了一下,虽然不是运维,想了解一点东西就希望了解清楚. 一.含义 “T ...

  4. jackson实体转json时 为NULL不参加序列化的汇总

    首先加入依赖 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson ...

  5. maven聚合工程使用如何debug

    maven聚合工程在正常情况下,使用debug时会出错,因为没有源码,就不会显示代码和断点行数条. 进行如下操作: 默认情况下source下只有默认的default文件夹,点击remove进行删除(这 ...

  6. 【转】Vue中mintui的field实现blur和focus事件

    首先上代码说总结: <mt-field label="卡号" v-model="card.cardNo" @blur.native.capture=&qu ...

  7. ActiveMQ broker 非持久化queue消息的入队、出队和应答

    消息入队:Queue.doMessageSend 消息分发:Queue.doActualDispatch 消息发送:TransportConnection.dispatch broker收到consu ...

  8. openssh允许root用户登录

    openssh默认是不允许root用户登录的,未改配置直接以正确的root账号密码登录会提示用户名密码错误之类. 好消息是openssh配置十分清晰,基本所有的服务端配置都在/etc/ssh/sshd ...

  9. MFC消息-自定义消息

    转:http://blog.csdn.net/penpenandtongtong/article/details/18598907 像MFC的窗口发送消息,可以进行自定义的动作行为,因此很多时候非常有 ...

  10. 0.5px的宽度的边框

    方法1:  .border {    position: relative;} .border:before {    content: "";/* 注意这里为双引号 */     ...