不久前写了个抓取网页内容的小程序,跑了一晚上,本以为早上起来都抓完了,谁知道程序死掉了,分析半天,才发现用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.