因为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. Microsoft SQL Server 获得本地帮助方法

    微软的自带的帮助文档不管是对于开发人员还是DBA都是相当的重要.一般在有网络的状况下可以直接访问 http://msdn.microsoft.com/query/dev10.query?appId=D ...

  2. Java parseInt_使用此方法得到的原始数据类型的一个特定的字符串

    Java parseInt解释加方法示例     使用此方法得到的原始数据类型的一个特定的字符串. parseXxx()是一个静态方法,可以有一个参数或两个         java parseInt ...

  3. [01] Oracle数据库简介

    Oracle关系型数据库:建立在关系模型上. Oracle10g:g(grid)网格技术,网格计算(Grid Computing)通过网络共享,将大量的计算机连接起来,联合各个计算机的多余处理能力,产 ...

  4. WCF编程系列(七)信道及信道工厂

    WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...

  5. oracle 12 C启动问题

    启动时出现以下报错信息: SQL> startup; ORA-48146: missing read, write, or exec permission on directory during ...

  6. UIButton 按钮文字左对齐

    btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; btn.titleEdgeInsets = UIEd ...

  7. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记2 Xcode、Auto Layout及MVC

    原文链接不知道在哪, 接着上一话来讲,上一话中讲到了MVC,那么MVC在IOS8开发中是如何应用的呢?Paul Hegarty老师给我们展示了一个计算器的Demo,首先新建一个工程,老师把AppDel ...

  8. Java多线程练习:ticket卖票程序

    /*需求:简单的卖票程序多个窗口买票 */ class Ticket extends Thread{    private static int tick=100;    public void ru ...

  9. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  10. Ubuntu下GCC的安装以及版本控制

    在Ubuntu下安装GCC和其他一些Linux系统有点不一样. 方法一: 该方法超简单:sudo apt-get  build-depgcc 就上面这条命令就可以搞定 方法二:sudo apt-get ...