日志类(三)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 LogServers: TList read FLogServers;
 10     function AddLogServer(ALog: TLog): Integer;
 11     procedure RemoveLogServer(ALog: TLog);
 12     constructor Create();
 13     procedure Execute; override;
 14   end;
 15
 16   TLog = class
 17   private
 18     FName: string;
 19     FFields: TFields;
 20     FFile: string;
 21     FTempFile: string;
 22     FFileState: Integer;
 23     FFileCount: Integer;
 24     FExtension: string;
 25     FlogValidity: TDateTime;
 26     FIsBufClear: Boolean;
 27     FMaxFileNum: Integer;
 28     FlogCount: Integer;
 29     FActive: Boolean;
 30     FWorker: TLogThread;
 31     FBuf: TStringList;
 32     FDateStr: string;
 33     FPerFileSize: Integer;
 34     FBaseWriter: TStreamWriter;
 35     FBaseReader: TStreamReader;
 36     procedure SetFile(sFile: string);
 37     procedure SetMaxFileNum(Max: Integer);
 38     procedure SetActive(Staue: Boolean);
 39     procedure Check;
 40   public
 41     // 名字
 42     property Name: string read FName;
 43     // 字段
 44     property Fields: TFields read FFields;
 45     // 日志目录( 日志文件夹路径 )
 46     property LogFile: string read FFile write SetFile;
 47     // 日志文件扩展名 默认‘log‘
 48     property Extension: string read FExtension write FExtension;
 49     { ↓ logValidity,MaxFileNum必须至少有一个有效数值 }
 50     // 日志文件有效期
 51     property logValidity: TDateTime read FlogValidity write FlogValidity;
 52     // 保存日志文件上限数目 默认200 可设置最小值域 2  值=-1无上限
 53     property MaxFileNum: Integer read FMaxFileNum write SetMaxFileNum
 54       default 200;
 55     property PerFileSize: Integer read FPerFileSize write FPerFileSize
 56       default 20 * 1024;
 57     { ↑ }
 58     // 缓存是否为空
 59     property IsBufClear: Boolean read FIsBufClear;
 60     // 日志条目数(文件+缓冲区)
 61     property logCount: Integer read FlogCount;
 62     // 日志服务状态
 63     property Active: Boolean read FActive write SetActive;
 64     // 启用/停止 服务
 65     procedure Start();
 66     procedure Stop();
 67     // 立即存储缓冲区数据
 68     procedure SaveBuf();
 69     // 写入字段标题
 70     procedure SaveFields;
 71
 72     procedure WriteLog(Inf: string);
 73     constructor Create(logName: string; LogFile: string; Woker: TLogThread);
 74     destructor Destroy; override;
 75   end;
 76
 77 implementation
 78
 79 var
 80   LogLock: TCriticalSection;
 81   LogThread: TLogThread;
 82
 83
 84 { TLog }
 85
 86 procedure TLog.Check;
 87 begin
 88   TPathFile.SearthFile(FFile, ‘*.‘ + FExtension, True);
 89 end;
 90
 91 constructor TLog.Create(logName: string; LogFile: string; Woker: TLogThread);
 92 begin
 93   Assert(logName <> ‘‘, ‘Error:UnitName->‘ + UnitName + ‘,ClassName->‘ +
 94     ClassName + ‘TLog.Create,logName is invalid!‘);
 95   FFileState := FILE_CLOSE;
 96   FExtension := ‘log‘;
 97   FTempFile := ‘‘;
 98   FName := logName;
 99   FMaxFileNum := 200;
100   FPerFileSize := 20 * 1024;
101   FIsBufClear := False;
102   FBuf := TStringList.Create;
103   FWorker := Woker;
104   FWorker.LogServers.Add(Self);
105   FFile := TPathFile.FullPath(LogFile);
106   FFields := TFields.Create();
107   //
108   if not Assigned(LogLock) then
109   begin
110     LogLock := TCriticalSection.Create;
111     LogThread := TLogThread.Create;
112   end;
113 end;
114
115 destructor TLog.Destroy;
116 begin
117   FWorker.RemoveLogServer(Self);
118   if FWorker.FLogServers.Count = 0 then
119     FreeAndNil(LogLock);
120   FBuf.Free;
121   FFields.Free;
122   FBaseWriter.BaseStream.Free;
123   FBaseWriter.Close;
124   FBaseWriter.Free;
125   inherited;
126 end;
127
128 procedure TLog.SaveBuf;
129 var
130   TempInt: Integer;
131 begin
132   if FActive then
133     Exit;
134
135   if FIsBufClear or (FFileState = FILE_READ) then
136     Exit;
137   if (FFileState = FILE_CLOSE) or (FDateStr <> DateTimeToStr(Date)) or
138     (FBaseWriter.BaseStream.Size >= FPerFileSize) then
139   begin
140     SaveFields;
141   end;
142
143   for TempInt := 0 to FBuf.Count - 1 do
144   begin
145     FBaseWriter.Write(FBuf[TempInt]);
146     FBaseWriter.WriteLine;
147   end;
148   //
149 end;
150
151 procedure TLog.SaveFields;
152 var
153   TempInt: Integer;
154 begin
155   if FFileState = FILE_WRITE then
156     FBaseWriter.Close;
157   FFileState := FILE_CLOSE;
158   if TFile.Exists(FTempFile) then
159   begin
160     try
161       FileSetAttr(FTempFile, faReadOnly);
162     finally
163     end;
164   end;
165
166   FDateStr := DateTimeToStr(Date);
167   FTempFile := FFile + ‘\‘ + FName + ‘\‘ + FDateStr + ‘\‘ + DateTimeToStr(Now);
168   FBaseWriter := TStreamWriter.Create(FTempFile, False, TEncoding.ASCII, 256);
169   FFileState := FILE_WRITE;
170   FBaseWriter.Write(FFields.Count);
171   FBaseWriter.WriteLine;
172   for TempInt := 0 to FFields.Count - 1 do
173   begin
174     FBaseWriter.Write(FFields.FTitle[TempInt]);
175     FBaseWriter.WriteLine;
176   end;
177 end;
178
179 procedure TLog.SetActive(Staue: Boolean);
180 begin
181   if Staue = Active then
182     Exit;
183   if Staue then
184     Start
185   else
186     Stop;
187 end;
188
189 procedure TLog.SetFile(sFile: string);
190 begin
191   FFile := TPathFile.FullPath(sFile);
192 end;
193
194 procedure TLog.SetMaxFileNum(Max: Integer);
195 begin
196   if Max = -1 then
197   begin
198     FMaxFileNum := Max;
199     Exit;
200   end;
201
202   if Max < 2 then
203     Max := 2;
204   FMaxFileNum := Max;
205 end;
206
207 procedure TLog.Start;
208 begin
209   FActive := True;
210 end;
211
212 procedure TLog.Stop;
213 begin
214   FActive := False;
215 end;
216
217 procedure TLog.WriteLog(Inf: string);
218 begin
219   FActive := True;
220   FBuf.Add(Inf);
221 end;
222
223 { TLogThread }
224
225 function TLogThread.AddLogServer(ALog: TLog): Integer;
226 begin
227   Result := FLogServers.Add(ALog);
228 end;
229
230 constructor TLogThread.Create;
231 begin
232   FLogServers := TList.Create;
233   FEvent := TEvent.Create();
234   FreeOnTerminate := True;
235 end;
236
237 procedure TLogThread.Execute;
238 var
239   TempInt: Integer;
240 begin
241   inherited;
242   while not Terminated do
243   begin
244     if FEvent.WaitFor(FInterval) = wrSignaled then
245     begin
246       if FLogServers.Count = 0 then
247         Exit;
248     end;
249     for TempInt := 0 to FLogServers.Count - 1 do
250       TLog(FLogServers[TempInt]).SaveBuf;
251   end;
252 end;
253
254 procedure TLogThread.RemoveLogServer(ALog: TLog);
255 begin
256   LogLock.Enter;
257   FLogServers.Remove(ALog);
258   if FLogServers.Count = 0 then
259   begin
260     Terminate;
261   end;
262   LogLock.Leave;
263 end;
264
265 procedure TLogThread.SetInterval(pvInterval: Integer);
266 begin
267   FInterval := pvInterval;
268   FEvent.SetEvent;
269 end;
270
271 end.


日志类(三)TLog ①

时间: 2024-02-20 09:19:57

日志类(三)TLog ①的相关文章

日志类(一)字段

今年一直想写一个基于完成端口的服务器,但是因为生活上的事屡屡推迟.此次怀着进行到底的决心开始.给自己的目标每周2单元(业余爱好者,能写的时间不多.2单元安排比较合理) 言归正传.一个完备的服务器首先必不可缺的是预警系统.无论是内部错误,还是外部攻击.都应该有响应的处理,那么记录下服务器的状态是我们分析问题的关键.那么日志类应运而生. 一个工程级的日志类应具备消耗资源少(CPU,内存),稳定,便于管理和查看的特点.数据库模式就值得我们参考,写一个轻量级的防数据库模式的日志类是此次目标. 我将此次工

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

上一篇文章写了普通数字类型类型的监控报警,本文谈一下怎么样做好日志类的监控和报警 一.日志类报警的特点 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++实

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

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

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

分析laravel的核心日志类

首先是容器 log对应的是application这个容器 首先我们查看如何获取这个日志类,我们来到\storage\app.php中找到application这个容器,点进去, 我们来到了 点击这个跳转后,我们会发现了日志服务提供者,点进去 我们就会找到这个类 logserviceprovider这个类 我们就会发现绑定的字符串为log,通过这个绑定到容器中. 我们接着写 我们来到控制台,找到日志文件\storage\logs\laravel.log 打印发现有了 如何应用依赖注入呐 在\sto

[原创]分享一个轻量级日志类

日常开发中,常常会在程序部署到生产环境后发现有些问题,但无法直接调试,这就需要用到日志,本来想找一些开源的完善的日志类来实现,但试了几个都感觉太重.于是意识到一个问题,懒是偷不得的,只好撸起袖子,自己写一个.这个日志类是基于订阅模式的,而且是线程安全的,现在分享给大家,希望能给大家带来帮助. 闲话不多说,直接上代码.代码有两个实现版本(Java与C#),这里放出的是C#. 一共用到三个类:JzgLogs.cs主类,LogBuffer.cs日志缓冲类,LogInfo是用于日志缓冲中做记录的实体类,

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

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

简易的日志类

打日志是开发不可或缺的功能, 它经常比断点好用, 并且可用性更广. 在很久以前, 我总习惯性的printf, cout, 把日志打印在控制台. 直到我发现, 这除了针对性的看日志, 并没有什么乱用. 你的程序提交到测试那里, 程序出现意外, 你不能指望测试给你提供崩溃当时的日志, 也不能及时赶到现场, 发动写轮眼记下原因. 所以, 日志除了打印在屏幕, 还要写日到文件... 1 // 日志写入. 2 class Log { 3 public: 4 // 日志结束符. 5 class End {}