不久前写了个抓取网页内容的小程序,跑了一晚上,本以为早上起来都抓完了,谁知道程序死掉了,分析半天,才发现用tmemo来记录日志的信息太多了,越积越多,本来memo的容量就不大。对于无法控制信息量的日志来说,有可能造成崩溃。记得见过盒子上一个关于手机发短信的小程序,上面有个日志的写法不错。 方法: 1、每写一行日志,先判断memo的行数是否超过自己设定的行数,我一般设为1000行,这样保存的日志大小一般在64K左右 2、判断保存日志的目录是否存在,不存在就建 一个 3、用日期加时间取一个日志名,象这种2010-03-12_07-15-23-171.txt 。 4、判断这个文件是否存在,(因为有些监控信息出现很快,有可能瞬间就能到到自己设定的行数,这时保存会冲掉上次的日志),存在就再按现在的时间取个名字 5、保存日志,清除memo 上代码
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) mmo1: TMemo; btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure writelog(amemo: tmemo; mst: string); var mfile: string; begin //设定多少行进行保存,如果大于200行进行保存 不过默认一般用1000行,这样一个日志文件在64K左右 if amemo.Lines.Count > 200 then begin //判断保存日志文件的目录是否存在 if not DirectoryExists(ExtractFilePath(ParamStr(0)) + 'logdata') then MkDir(ExtractFilePath(ParamStr(0)) + 'logdata');
//按日期及时间设定保存日志的文件名 mfile := ExtractFilePath(ParamStr(0)) + 'logdata\' + formatdatetime('yyyy-mm-dd_hh-mm-ss-zzz', now) + '.txt'; while fileexists(mfile) do //如果此时间名称日志文件存在,再按下一时间进行取名 begin mfile := ExtractFilePath(ParamStr(0)) + 'logdata\' + formatdatetime('yyyy-mm-dd_hh-mm-ss-zzz', now) + '.txt'; end; //保存日志,并清空memo amemo.Lines.SaveToFile(mfile); amemo.Clear; end; amemo.Lines.Add(formatdatetime('yy-mm-dd hh:mm:ss ', now) + '>>' + mst) end;
procedure TForm1.btn1Click(Sender: TObject); var i: Integer; begin for i := 0 to 400 do begin writelog(mmo1, '日志信息' + inttostr(i)); end; end;
end.
|
请发表评论