因为delphi不是我的主力开发工具,所有一直没有使用一个正式的日志组件。
偶尔要记日志时,就复制同事的一个简单的文件日志函数。
现在又要用到delphi日志了,决定找个通用的日志组件,造福共事的Delphi程序员们。

让我失望的是,日志功能好像对Delphi程序员没什么吸引力,
百度“Delphi 日志”竟然没有什么有用线索。还是Google“Delphi logger”有点用。

不管怎样,让我找到了log4delphi。明显国内用的人不多,不知大家是否有更好的日志类。
对我来说,log4delphi与log4j、log4cpp如出一辙,正合我意。
0.7版,近两年没更新了。看SVN也是没有任何更新。
下载了看,文档相当全。

因为用D6,而bin包只有D7的,所以自己需要编译一个包。编译时注意:
 
  * 有STD和PROF两个版本的*.dpk,比较一下,STD没有RollingAppender,看来PROF全一点。
  * 参考编译出错信息,需手工创建build目录。
  * 编译报util/TFileUnit文件未找到,直接删了它就好了,没用。

可能用它自带的Makefile更快更好,但好像Makefile是对D7的,也要改。
顺便安装包,并添加lib目录。

DELPHI盒子网站上有个log4Delphi v0.7 修改版,据称发现并改正了内存泄漏。
http://www.2ccc.com/article.asp?articleid=3900
我也下载查看了,觉得没改全,发了个评论。决定暂时用原版。

接下来就可以按照它的Get Started和Tutorial试用了。

Get Started例子:

日志文件在写时,无法共享读取,不能实时查看日志。
日志文件名必须是完整路径,不能仅是文件名,也不能‘./test.log’这样。
TFileAppender创建时会清空文件,而不是Append。

Tutorial例子:

TConfiguratorUnit.doPropertiesConfiguration('log4delphi.properties');
同样使用TFileAppender时却没有打开日志文件时的共享违例。

仅配置rootLogger,没有配置subLogger时,subLogger无输出。与log4j不同。

转载自:http://blog.csdn.net/brightgems/archive/2006/06/19/814042.aspx

Log4d是apache下的一个delphi开源子项目,它的设计思想来源于Log4j,但并不是Log4j的子项目,主要目标是开发环境与生产环境下的日志输出。

一、下载
https://sourceforge.net/project/showfiles.php?group_id=145326
二、安装
将源代码下的log4delphi\src\delphi\log4delphi_D6.dpk包安装在IDE下。
三、基本使用方法
1.在dpr文件的source 中创建Logger实例(TConfiguratorUnit.doBasicConfiguration)
如:
  Application.Initialize;
//使用运行期默认配置,输出日志文件名是'log4delphi.log’
  TConfiguratorUnit.doBasicConfiguration;
  Application.CreateForm(TForm1, Form1);
  Application.Run;  
2.配置Logger
var
   logger : TLogger;
begin
   logger := TLogger.getInstance;
   logger.setLevel(TLevelUnit.INFO);
   logger.addAppender(TFileAppender.Create('C:\test.log'));  
3.在你需要的地方写Log信息
根据Level的类型,有五种类别的Log信息
logger.debug('Debug message');
   logger.info('Info message');
   logger.warn('Warn message');
   logger.error('Error message');
   logger.fatal('Fatal message');
4.释放Logger实例
Finalization
    TLogger.freeInstances;
四、更深入的介绍
Log4d由五个核心的components组成:Levels, LoggingEvents, Layouts, Appenders and Loggers.
1. Levels。每一个Log event 都有一个优先级,Levels就是用来表示优先级的。因此,每一个优先级其实就是一个数值常量,可用于比较。
Level有以下几种:
TLevelUnit.OFF
  TLevelUnit.FATAL
  TLevelUnit.ERROR
  TLevelUnit.WARN
  TLevelUnit.INFO
  TLevelUnit.DEBUG
  TLevelUnit.ALL
2.LoggingEvents.当产生一个Log信息或Logger实例创建时发生。
Logging 包含的重要信息有:发生时间,消息内容,已经发生的异常及优先级。
3. Layouts.它负责LoggingEvents的格式化输出样式。
The TLayout 有以下方法:
  function format(event : TLoggingEvent) : String; Virtual; Abstract;
  function getContentType() : String; Virtual;
  function getHeader() : String; Virtual;
  function getFooter() : String; Virtual;
  function ignoresException() : Boolean; Virtual;
常用的Layout有:
l TSimpleLayout
输出内容如:DEBUG - Button Clicked
l TPatternLayout.它为格式化输出提供了更多的控制。格式化的模式与Format函数相似,即以%开头,接着跟修饰符和转换符。如:
Pattern="%d [%5p] %m%n"
产生的输出是
12/20/2005 4:53:33 PM [DEBUG] Debug message
12/20/2005 4:53:33 PM [ INFO] Info message
12/20/2005 4:53:33 PM [ WARN] Warn message
12/20/2005 4:53:33 PM [ERROR] Error message
12/20/2005 4:53:33 PM [FATAL] Fatal message
含义: %d 日期
 %m 消息内容
 %n 换行
 %p 优先级
 %e 异常的类名与message
 %L Logger的名称
4. Appenders.表示输出的目的是控制台,文件,还是数据库。
常用的有TFileAppender, TDBAppender

五、配置文件
1.程序里加载配置文件
Application.Initialize;
  TConfiguratorUnit.doPropertiesConfiguration('log4delphi.properties'); 
  Application.CreateForm(TForm1, Form1);
  Application.Run;

2.写配置文件'log4delphi.properties'
l 控制输出的信息类别
# Set this to true to turn on Log4Delphi's internal
# logging
log4delphi.debug=false 
log4delphi.info=false 
log4delphi.all=true
l Root Logger
# Set the root logger's priority threshold to DEBUG and assign an 
# appender named "fileAppender" to it.
log4delphi.rootLogger=DEBUG, fileAppender
l 配置Appender
# Specify the appender class for fileAppender.
log4delphi.appender.fileAppender=TFileAppender
    
# Specify which file fileAppender should use.
log4delphi.appender.fileAppender.File=app.log
l 设置Layout
# Specify the layout class for fileAppender.
log4delphi.appender.fileAppender.layout=TSimpleLayout  
# Use TPattern layout
log4delphi.appender.fileAppender.layout=TPatternLayout
log4delphi.appender.fileAppender.layout.pattern=%d [%5p] %m%n

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/brightgems/archive/2006/06/19/814042.aspx

上面都是参考资料,下面是我自己使用过程中使用的过程:

1:安装PROF这个版本,通过文件对比可看出该版本应用的文件多点,可能会更好(猜的)。

2:添加源码以及dcu路径。(在工具->环境选项->Library path中加入该两个路径:“src\delphi”、“build”)。

3:在Application.Initialize;的后面调用doPropertiesConfiguration('log4delphi.properties'); 去读取配置并初始化log4。(注意,该方法在TConfiguratorUnit单元中,需要use该单元)

4:将log4delphi.properties放入应用程序同一目录下。log4delphi.properties可从下载包中得到。

5:调用log4的记录方法:TLogger.getInstance.debug('Button Clicked!');(需要引入TLoggerUnit单元)。

执行的话基本上都能在程序所在的目录下有个*.log文件。

6:释放掉TLogger的对象:在不用TLogger对象时释放:TLogger.freeInstances;(一般在程序退出的时候要把该对象释放掉)

有关配置文件中一个要注意的地方:


#log4delphi.appender.fileAppender.layout=TSimpleLayout
#log4delphi.appender.fileAppender.layout=TXMLLayout
#log4delphi.appender.fileAppender.layout=THTMLLayout
#log4delphi.appender.fileAppender.layout.Title=Document Title
log4delphi.appender.fileAppender.layout=TPatternLayout
log4delphi.appender.fileAppender.layout.Pattern=%d{YYYY-MM-DD HH:mm:nn:zzz} [%5p] %m%n

这样配置才能把时间按照{}的格式进行日志输出。由于该log4delphi的配置资料基本上没有,因此,该配置需要看源码才能知道有哪些配置该怎么设置。目前我还不知道如何让日志文件按照时间格式来自动生成出来,我怀疑,它会根据设置的容量,自动把历史数据保存到另外一个以保存日期为名称的文件。有待日后验证。

今天早上测试了下,发现有如下一个配置:


代码

#定义日志记录的类型
#log4delphi.appender.fileAppender=TFileAppender
log4delphi.appender.fileAppender=TRollingFileAppender
log4delphi.appender.fileAppender.MaxBackupIndex=20
log4delphi.appender.fileAppender.MaxFileSize=3M
log4delphi.appender.fileAppender.File=app.log
log4delphi.appender.fileAppender.AppDir=true
log4delphi.appender.fileAppender.Append=true

fileAppender=TRollingFileAppender这个配置才会实现超出MaxFileSize时,会把日志根据大小自动分割后保存到后缀为*.log.1、*.log.2类似的文件。如果没猜错,MaxBackupIndex这个属性应该是*.log.?这个?的值了。

http://www.cnblogs.com/kfarvid/archive/2010/08/02/1790641.html

Log4delphi使用心得的更多相关文章

  1. Delphi 7下使用Log4Delphi 0.8日志组件

    Log4Delphi是一个开放源码项目,旨在制作用于Borland的Delphi高质量实用的日志套件,是基于Apache Software Foundation的log4j包. 安装:         ...

  2. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  3. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  4. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  6. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  7. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  8. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  9. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. 【Android】关于pix,dip,dip,sp等相关概念

    1.px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位. dip或dp (device independent pixels)设备独立像素, 与设备屏幕有关. sp (scaled p ...

  2. -exec和|xargs

    注意xargs会被空格割裂,所以遇到带有空格的文件名就不好办了,解决方法是使用-print0 例如:删除.目录下30天之前的.png文件 -type f -name rm 或者使用-exec:删除.目 ...

  3. jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)

    在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...

  4. 如何在浏览器网页中实现java小应用程序的功能

    我们知道,java语言的运用就是面向对象实现功能,和c不同,java语言对于程序员来说,运用起来更为简便. 小应用程序与应用程序不同,小应用程序只能在与Java兼容的容器中运行,可以嵌入在HTML网页 ...

  5. 牛客网算法题之All-in-All

    题目: 有两个字符串s 和t,如果即从s 中删除一些字符,将剩余的字符连接起来,即可获得t.则称t是s 的子序列.请你开发一个程序,判断t是否是s的子序列. 输入描述: 输入包含多组数据,每组数据包含 ...

  6. IO流05_OutputStream和Writer输出流

    [输出流中的字节流和字符流] [OutPutStream和Writer] [ OutputStream和Writer中包含的方法 ] void write(int c)       将指定的字节/字符 ...

  7. WPF 关于XDocument(xml) 的部分操作记录

    (1)删除xml文件中的一个结点的方法,有如下两种方式(只有存在数据绑定的情况下才会有第二种情况,否则一般是第一种情况): private void DeletePacsNode() { //从xml ...

  8. 393. UTF-8 Validation

    393. UTF-8 Validation 这个题很明确,刚开始我以为只能是一个utf,长度大于5的都判断为false,后来才明白题意. 有个小trick,就是长度大于1的时候,判断第一个数字开始1的 ...

  9. parseInt()、parseFloat()与Number()的比较

    我有一个同学最近在自学JavaScript,偶尔遇到问题了会让我帮忙解决,虽然我也是一个JavaScript菜鸟,但是我还是很乐意帮忙,这样不仅可以帮到别人,也可以让自己在解决问题的过程中学到更多知识 ...

  10. Asp.net 图片文件防盗链介绍

    想要实现文件放盗链的功能 首先添加一个全局文件 Global.asax 在 Application_BeginRequest中我们可以判断Http报文头中的UrlReferre是否来源本站. if ( ...