日志类(一)字段

今年一直想写一个基于完成端口的服务器,但是因为生活上的事屡屡推迟。此次怀着进行到底的决心开始。给自己的目标每周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

日志类(一)字段的相关文章

WorldWind源码剖析系列:日志类Log

Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs : EventArgs//日志事件参数 { public int level; public string category; public string message; public LogEventArgs(int _l, string _c, string _m) { level = _l

日志类(三)TLog ①

功能未完善. 待续. 1 TLogThread = class(TThread) 2 private 3 FInterval: Integer; 4 FLogServers: TList; 5 FEvent: TEvent; 6 procedure SetInterval(pvInterval: Integer); 7 protected 8 property Interval: Integer read FInterval write SetInterval; 9 property LogSe

一个项目需要考虑的问题:项目路径,数据库设计和权限,安全策略,日志类实现,页面基本结构

整个项目的流程 1.构建整个项目的框架结构[基本常量的定义] [实现一个框架需要权衡和良好的包含体系] 2.数据库设计和权限控制[对访问数据库的用户权限控制:默认新创建的用户对库内的数据并没有操作权限:Grant语句进行全新啊管理] 在项目建立之初,对数据库表结构进行设计是项目的关键. 考虑到各个业务层面上,设计各自的表结构. 注意数据库的三范式结构: 数据不可分割:第一范式[关联型数据库][针对每一列字段] 每一行数据的独立性:第二范式[针对每一行数据] 数据表之间的数据不要重复冗余:第三范式

多人即时战斗游戏服务端系列[3]--日志类及Config类以及Excel生成类

这里说一些辅助类的设计及介绍. 依然上类图先: 首先是日志类和Config,这个库以及Config库取自暗黑3的民间模拟器mooege, 当时看了写的简短小巧就直接拿过来用了. 后来虽然发现一些问题,进行简单修改和优化之后,在项目中进行使用了. 首先是日志类,看了下类图也就没几行,简单的就是一些输出层级,带有可外部加载的扩展方法,ExtensionLogTarget,通过反射加载,然后进行一些扩展目标的输出. 修改部分的话,比较简单,原先日志是同步输出,这样会导致卡掉一些时间比较敏感的运算,这边

c++ 日志类 线程安全+缓存

根据上一次的测试,有缓存的日志类性能会更好.用到了time.h类函数,所以在linux下就要改动一下了,windows环境下写的. 思路采用(参照muduo库的日志,不过认为他线程不安全,和没用缓存,就改造了下) 1.有一个总的缓存,logboss,为一个恶汉模式的单例类,指针对象为智能指针,析构函数讲缓存写入文件. 2.有一个logger类,作为临时缓存,析构函数,将里面的缓存写入总缓存(在总缓存写入的时候加锁).如果缓存超过一定限度,就将前面的缓存写入文件先. void LogBoss::a

命名技巧(包。类。字段。方法)

根据很多人习惯和一些约定俗成,在编程的时候设包名讲究一定的技巧,这样既方便自己记忆,又方便别人将包中的类分类观看: 1.跟用户相接触的包名示例:com.project_name.ui 2.跟数据库相关的包名示例:com.project_name.dao(date access object) 3.java封装类包包名示例:com.project_name.domain com.project_name.bean com.project_name.entity(里面装的是javabean封装类)

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例

怎么样做好日志类的报警监控

上一篇文章写了普通数字类型类型的监控报警,本文谈一下怎么样做好日志类的监控和报警 一.日志类报警的特点 1.接受人员希望直接看到日志的内容: 2.对应技术栈涉及比较广的系统,,一个问题会引发不同主机上面不同系统同时产生日志.举例:openstack 的nova在保存快照时出错,会引起nova-api,galnce-api,horizen同时产生错误日志. 二.遇到的痛点: 1.有很多人想随时查看日志,不同的人想要查看不同的日志: 2.日志类的报警,不适合用微信直接发送内容,原因一是转义麻烦,二是

C++开源日志类

今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.0 2.log4cxx 下载地址:http://logging.apache.org/log4cxx/download.html (log4cxx 是由JAVA实现的 log4j 开源的,用C++实