log4delphi使用及UDP上传日志扩展详解

来源:互联网 发布:java socket编程 编辑:程序博客网 时间:2024/06/06 10:41


Log4Delphi是一个开放源码项目,旨在制作用于Borland的Delphi高质量实用的日志套件,是基于Apache Software Foundation的log4j包。虽然这个项目已随着delphi“过时”,它最后一次更新在2006年,但是他具有logging的一贯风格,对于还在使用delphi的同鞋们还是可以考虑一下的。以下是我使用后,整理的一点资料及一个UDPSocket日志上传的扩展,仅供参考。

1      下载及安装

1.   从http://sourceforge.net/projects/log4delphi/files/下载0.8版本,解压到文件夹。

2.   打开文件夹"...\log4delphi-0.8",新建一个文件夹"build";

3.   运行Delphi 7,打开组件包"log4delphi_D7_STD.dpk",位于"...\log4delphi-0.8\src\delphi"下,点击"Compile"和"Install"进行编译安装;

4.   菜单"Tools"→"EnvironmentOptions"→"Library"→"Library path",添加"...\log4delphi-0.8\build"目录(如果需要连接源代码,则再添加"...\log4delphi-0.8\src\delphi"和"...\log4delphi-0.8\src\delphi\util");

 

安装包说明:

bin/        项目二进制文件(无用).

build/      项目编译文件目录(需要自行添加).

docs/       文档目录(无用).

example/    配置文件实例.

lib/        测试单元所需要包(无用).

src/        Log4Delphi项目代码.

 

2      初次试用

1.   新建一个应用程序,保存当前工程。

2.   菜单"Project"→"ViewSource",添加初始化日志等,代码如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

programProject1;

uses
Forms,
TConfiguratorUnit,{需要引用该单元}
Unit1in'Unit1.pas'{Form1};

{$R*.res}

begin
Application.Initialize;
doPropertiesConfiguration('log4delphi.properties');{初始化,读取属性}
Application.CreateForm(TForm1,Form1);
Application.Run;
end.

 

3.   将"...\log4delphi-0.8\example\log4delphi.properties"复制到工程目录下;

4.   在窗体上放置两个按钮,单击事件和窗体的销毁事件如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20

implementation

usesTLoggerUnit;{需引用此单元}

{$R*.dfm}

procedureTForm1.btn1Click(Sender:TObject);
begin
TLogger.GetInstance.Debug('按钮1被点了');{获取TLogger实例}
end;

procedureTForm1.btn2Click(Sender:TObject);
begin
TLogger.GetInstance.Info('按钮2也被点了');{包括:Fatal、Error、Warn、Info、Debug、Trace}
end;

procedureTForm1.FormDestroy(Sender:TObject);
begin
TLogger.FreeInstances;{在不需要使用的时候,释放掉}
end;

 

5.   运行程序,点击按钮一和按钮二,关闭程序。在工程目录下,发现会有"app.log"文件,打开如下所示:

 

 

3      配置文件详解

3.1实例

log4delphi.rootLogger=ALL,fileAppender,fileAppender2  

#自动分文件输出

log4delphi.appender.fileAppender=TRollingFileAppender

log4delphi.appender.fileAppender.File=D:\\java\\logs\\qc.log

log4delphi.appender.fileAppender.layout=TPatternLayout

log4delphi.appender.fileAppender.layout.Pattern=[JY][%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p] [%e] [%L] %m%n

#固定文件输出

log4delphi.appender.fileAppender2=TFileAppender

log4delphi.appender.fileAppender2.File=app2.log

log4delphi.appender.fileAppender2.layout=TXMLLayout

3.2日志设置

log4delphi.rootLogger=DEBUG,fileAppender,fileAppender2此句为将等级为INFO的日志信息输出到fileAppender和fileAppender2这两个目的地,fileAppender和fileAppender2可以任意起名。

等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,一般只使用ERROR、WARN、INFO、DEBUG四级。

各级别说明:

OFF    关闭所有日志

FATAL 灾难性错误

ERROR 为严重错误 主要是程序的错误
WARN 为一般警告,比如session丢失
INFO 为一般要显示的信息,比如登录登出
DEBUG 为程序的调试信息

ALL  开启所有信息

3.3输出方式设置

目前该版的输出包括三种方式:TFileAppender、TRollingFileAppender和TDBAppender,其中TDBAppender属于未完成的模式,在此不作说明。

1. 固定文件输出

log4delphi.appender.fileAppender2=TFileAppender

log4delphi.appender.fileAppender.File=app.log

log4delphi.appender.fileAppender.AppDir=true

log4delphi.appender.fileAppender.Append=true

 

2. 自动分文件输出

log4delphi.appender.fileAppender=TRollingFileAppender

log4delphi.appender.fileAppender.MaxBackupIndex=3

log4delphi.appender.fileAppender.MaxFileSize=1M

log4delphi.appender.fileAppender.Append=true

3.4布局

1.  简化格式

log4delphi.appender.fileAppender.layout=TSimpleLayout

 

2.  xml格式

log4delphi.appender.fileAppender.layout=TXMLLayout

 

3.  htmls格式

log4delphi.appender.fileAppender.layout=THTMLLayout

#log4delphi.appender.fileAppender.layout.Title=DocumentTitle

 

4.  自定义格式

#log4delphi.appender.fileAppender.layout=TPatternLayout

#log4delphi.appender.fileAppender.layout.Pattern=%d{ddmmm yyyy hh:nn:ss:zzz} [%5p] %m%n

 

关于配制说明:

 %d 日期
 %m 消息内容
 %n 换行
 %p 优先级
 %e 异常的类名与message
 %L Logger的名称

4      Delphi中代码的编写

1.  日志文件的引用

在程序文件project中增加TConfiguratorUnit的引用

2.  日志初始化设置

doPropertiesConfiguration('log4delphi.properties');

3.  日志输出代码

TLogger.GetInstance.Info('按钮1被点了');

TLogger.GetInstance.Error('按钮1被点了');

TLogger.GetInstance.Debug('按钮1被点了');

5      多个日志处理器的设置

1.  配置文件

#默认日志处理root

log4delphi.rootLogger=ALL,fileAppender

log4delphi.appender.fileAppender=TFileAppender

log4delphi.appender.fileAppender.File=app2.log

log4delphi.appender.fileAppender.layout=TXMLLayout

#自定义日志处理logger1

log4delphi.logger.Logger1=WARN,fileAppender2

log4delphi.appender.fileAppender2=TFileAppender

log4delphi.appender.fileAppender2.File=app2.log

log4delphi.appender.fileAppender2.layout=TXMLLayout

 

2.  代码使用

TLogger.GetInstance(‘root’).Debug('按钮1被点了');

TLogger.GetInstance(‘logger1’).Debug('按钮1被点了');

6      自定义UDP日志输出

6.1增加UDP输出处理类文件

6.2修改配置引导

在输出处理配置类中添加相应处理方法,修改TPropertyConfiguratorUnit.pas如下两处。

1.   增加引入类



2.   在输出初始化方法中增加UPD的初始化处理

在function InstantiateAppender(AName : String; AProps :TProperties;APrefix : String) : IAppender;的最后一行result:= appender;之前增加如下代码:



 //upd
  if (Pos('UDPAppender',AName) > 0) then
  begin
    appender := TUDPAppender.Create;
    tmp := AProps.GetProperty(APrefix + '.Host');
    if (tmp <> '') then
    begin
       TUDPAppender(appender).SetHost(tmp);
       TLogLog.debug(AName+' - Host');
    end;
    tmp := AProps.GetProperty(APrefix + '.Port');
    if (tmp <> '') then
    begin
      TUDPAppender(appender).SetPort(StrToInt(tmp));
       TLogLog.debug(AName+' - Port');
    end;
  end;

6.3重新编译

1.  打开log4delphi_D7_STD.dpk



2.   添加TUDPAppenderUnit.pas

 

3.   点击"Compile"编译

4.   点击"Install"安装

6.4测试及事例

1.  配置文件

log4delphi.rootLogger=ALL,upd,fileAppender   

log4delphi.appender.fileAppender=TRollingFileAppender
log4delphi.appender.fileAppender.File=D:\\java\\logs\\qc.log
log4delphi.appender.fileAppender.layout=TPatternLayout
log4delphi.appender.fileAppender.layout.Pattern=[JY] [%d{yyyy-MM-ddHH:mm:ss,SSS}] [%p] [%e] [%L] %m%n

log4delphi.appender.upd=TUDPAppender
log4delphi.appender.upd.Host=127.0.0.1
log4delphi.appender.upd.Port=9100
log4delphi.appender.upd.layout=TPatternLayout
log4delphi.appender.upd.layout.Pattern=[JY] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p][%e] [%L] %m%n

 

2.  写测试upd服务

procedureTForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  strStream:TStringStream;
begin
  strStream := TStringStream.Create('');
  strStream.CopyFrom(AData,AData.Size);

  memo1.Lines.Add(strStream.DataString);
end;



3.  执行效果

upd服务器端效果

文件中效果

 

 

原创粉丝点击