今年一直想写一个基于完成端口的服务器,但是因为生活上的事屡屡推迟。此次怀着进行到底的决心开始。给自己的目标每周2单元(业余爱好者,能写的时间不多.2单元安排比较合理)
言归正传。一个完备的服务器首先必不可缺的是预警系统。无论是内部错误,还是外部攻击。都应该有响应的处理,那么记录下服务器的状态是我们分析问题的关键。那么日志类应运而生。
一个工程级的日志类应具备消耗资源少(CPU,内存),稳定,便于管理和查看的特点。数据库模式就值得我们参考,写一个轻量级的防数据库模式的日志类是此次目标。
我将此次工程分为几个阶段
一. 字段(防数据库字段)
二. 文件管理(进行文件的创建以及删除)
三. 日志读写(日志主体)
四. 线程处理(一个工程级的日志类,这是必不可缺的。可以是多个类或函数公用。但不是多个线程。每个工程只分配一个线程即可。)
字段类如下所示:
1 { * 2 字段类 3 * } 4 TFields = class 5 private 6 // 标题 7 FTitle: TStringList; 8 // 默认值 9 FDefaultValue: TStringList; 10 function ReadCount: Integer; 11 public 12 property Count: Integer read ReadCount; 13 constructor Create(); 14 destructor Destroy; override; 15 // 添加字段 16 function AddTitle(newTitle: string; const Default: string = ‘‘): Integer; 17 // 查找字段 18 function Index(searTitle: string): Integer; 19 // 删除字段 20 function DeleteTitle(delTitle: string): Boolean; 21 // 修改字段默认值 22 function SetDefault(setTitle, Default: string): Boolean; 23 // 查看字段默认值 24 function SeeDefault(seeTitle: string): string; 25 // 改变字段标题 26 function ChangeTitle(oldTitle, newTitle: string; 27 const Default: string = ‘‘): Boolean; 28 // 清空标题 29 procedure ClearTitle(); 30 end; 31 32 { 实现如下 } 33 34 { TFields } 35 36 function TFields.AddTitle(newTitle: string; const Default: string): Integer; 37 begin 38 Result := -1; 39 if Index(newTitle) = -1 then 40 begin 41 Result := FTitle.Add(newTitle); 42 FDefaultValue.Add(Default); 43 end; 44 end; 45 46 function TFields.ChangeTitle(oldTitle, newTitle: string; 47 const Default: string = ‘‘): Boolean; 48 var 49 TempInt: Integer; 50 begin 51 Result := False; 52 TempInt := Index(oldTitle); 53 if TempInt <> -1 then 54 begin 55 FTitle.Strings[TempInt] := newTitle; 56 FDefaultValue.Strings[TempInt] := Default; 57 Result := True; 58 end; 59 end; 60 61 procedure TFields.ClearTitle; 62 begin 63 FTitle.Clear; 64 FDefaultValue.Clear; 65 end; 66 67 constructor TFields.Create(AOwner: TLog); 68 begin 69 FTitle := TStringList.Create; 70 FDefaultValue := TStringList.Create; 71 end; 72 73 function TFields.DeleteTitle(delTitle: string): Boolean; 74 var 75 TempInt: Integer; 76 begin 77 Result := False; 78 TempInt := Index(delTitle); 79 if TempInt <> -1 then 80 begin 81 FTitle.Delete(TempInt); 82 FDefaultValue.Delete(TempInt); 83 Result := True; 84 end; 85 end; 86 87 destructor TFields.Destroy; 88 begin 89 FTitle.Free; 90 FDefaultValue.Free; 91 inherited; 92 end; 93 94 function TFields.Index(searTitle: string): Integer; 95 begin 96 Result := FTitle.IndexOf(searTitle); 97 end; 98 99 function TFields.ReadCount: Integer; 100 begin 101 Result := FTitle.Count; 102 end; 103 104 function TFields.SeeDefault(seeTitle: string): string; 105 var 106 TempInt: Integer; 107 begin 108 Result := ‘‘; 109 TempInt := Index(seeTitle); 110 if TempInt <> -1 then 111 begin 112 Result := FDefaultValue.Strings[TempInt]; 113 end 114 else 115 Assert(False, ‘Error:UnitName->‘ + UnitName + ‘,ClassName->‘ + ClassName + 116 ‘FunctionName->SeeDefault,Parameter is invalid!‘); 117 end; 118 119 function TFields.SetDefault(setTitle, Default: string): Boolean; 120 var 121 TempInt: Integer; 122 begin 123 Result := False; 124 TempInt := Index(setTitle); 125 if TempInt <> -1 then 126 begin 127 FDefaultValue.Strings[TempInt] := Default; 128 Result := True; 129 end; 130 end;
时间: 2024-10-11 20:54:22