From 868daf94f29ce1ffdd799a68c07bb668cd373bcd Mon Sep 17 00:00:00 2001
From: HP\李良庭 <liliangting@lanpucloud.cn:1111>
Date: 星期二, 08 七月 2025 11:49:03 +0800
Subject: [PATCH] 提交分辨率自适应版本V3.1.0.1500

---
 src/log/log4me.pas |  231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 231 insertions(+), 0 deletions(-)

diff --git a/src/log/log4me.pas b/src/log/log4me.pas
new file mode 100644
index 0000000..814b835
--- /dev/null
+++ b/src/log/log4me.pas
@@ -0,0 +1,231 @@
+{------------------------------------------------------------------------------}
+{项目名称:日志单元                                                            }
+{单元名称:log4me.pas                                                          }
+{版本版次:1.3                                                                }
+{模块名称:公共函数库                                                          }
+{功能描述:输出error、info、debug、data 四个级别的日志                         }
+{建立日期:2011-01-01                                                          }
+{版权所有:李良庭                                                              }
+{------------------------------------------------------------------------------}
+{修改日志
+2019-02-28 调整按每小时生成日志文件,支持日志载入和管理。
+
+调用方法
+procedure  log4error(msg: AnsiString); //写ERROR级别的日志
+procedure  log4info(msg: AnsiString); //写INFO级别的日志
+procedure  log4debug(msg: AnsiString); //写DEBUG级别的日志
+function  log4filename():AnsiString; //得到当前日志文件全名
+ 
+ 配置文件 log4me.ini
+ 
+#配置文件和主程序在同一目录.没有这个文件或不在主目录中则不写日志
+[log4me]
+#path,日志的存放目录.必须是主程序目录及子目录.
+#例子:主程序目录
+#path=.
+#例子:子目录
+#path=temp\logs
+path=logs
+#level,日志等级,只能是 error,info,debug之一
+#为error时,只有log4error打印的日志被输出.
+#为info时,log4error和log4info打印的日志被输出.
+#为debug时,log4error,log4info,log4debug打印的日志都被输出.
+level=info
+}
+ 
+unit log4me;
+ 
+interface
+ 
+uses classes, sysutils, ComObj, windows,IniFiles;
+ 
+procedure  log4error(msg: AnsiString); //写ERROR级别的日志
+procedure  log4info(msg: AnsiString);  //写INFO 级别的日志
+procedure  log4debug(msg: AnsiString); //写DEBUG级别的日志
+procedure  log4data(msg, sfile: AnsiString);//写原始数据日志
+
+function  log4filename():AnsiString; //得到当前日志文件全名
+
+var
+  log_filename: AnsiString; //日志文件全名
+
+implementation
+
+ 
+var
+  log_ThreadLock: TRTLCriticalSection; // 临界区
+  log_fileStream: TFileStream;
+  log_filepath: AnsiString; //日志文件路径
+ 
+  log_initime:TDateTime; 
+  log_doerror, log_dodebug, log_doinfo: Boolean;
+ 
+ 
+procedure log_init();
+var
+ tmpStr:String;
+begin
+ 
+  log_doerror := False;
+  log_dodebug := False;
+  log_doinfo := False;
+ 
+  if FileExists(ExtractFilePath(ParamStr(0)) + 'config\log4me.ini') then
+  begin
+   
+    with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config\log4me.ini') do
+      try
+        log_filepath := ExtractFilePath(ParamStr(0)) + '\' + ReadString('log4me','path','logs') + '\';
+        tmpStr := LowerCase(ReadString('log4me','level','info'));
+ 
+        log_doerror :=  (tmpStr = 'debug') or (tmpStr = 'info') or (tmpStr = 'error');
+        log_doinfo  :=  (tmpStr = 'debug') or (tmpStr = 'info');
+        log_dodebug :=  (tmpStr = 'debug') ;
+      finally
+        Free;
+      end;
+ 
+  end;
+ 
+  log_initime := Now;
+ 
+end;
+ 
+procedure log4me_addLog(filename: AnsiString; p: PAnsiChar);
+var
+ fmode :Word;
+ tmp:AnsiString;
+begin
+ 
+  //进入临界区,多线程时可以保护资源
+  EnterCriticalSection(log_ThreadLock);
+ 
+  try
+      try
+        //如果要写的日志文件和打开的不同(在程序第一次运行和跨天的时候出现)
+        //则关闭打开的日志文件。
+        if filename <> log_filename then
+        begin
+          log_filename := filename;
+          if Assigned(log_fileStream) then
+          begin
+            log_fileStream.Free;
+            log_fileStream := nil;
+          end;
+        end;
+ 
+        //如果要写的日志文件没有打开(在程序第一次运行和跨天的时候出现)
+        //则打开日志文件。
+        if not Assigned(log_fileStream) then
+        begin
+           if FileExists(log_filename) then
+             fmode := fmOpenWrite or fmShareDenyNone
+           else
+             fmode := fmCreate or fmShareDenyNone ;
+          log_fileStream := TFileStream.Create(log_filename,fmode);
+          log_fileStream.Position := log_fileStream.Size;
+        end;
+ 
+        //在日志文件中写入日志
+        log_fileStream.Write(p^, strlen(p));
+ 
+      except
+       
+        on E:Exception do
+        begin
+            try
+              tmp := ExtractFilePath(ParamStr(0)) + 'log\log4me_err.log';
+              if FileExists(tmp) then
+                 fmode := fmOpenWrite or fmShareDenyNone
+              else
+                 fmode := fmCreate or fmShareDenyNone ;
+              with TFileStream.Create(tmp, fmode) do
+              begin
+                Position := Size;
+                tmp := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' ' +  E.Message +  #13#10;
+                Write(tmp[1],Length(tmp));
+                Free;
+              end;
+            except
+            end;
+        end;
+      end;
+ 
+  finally
+    //无论如何,离开临界区
+    LeaveCriticalSection(log_ThreadLock);
+  end;
+ 
+end;
+ 
+procedure log4write(msg: AnsiString);
+var
+  strline: AnsiString;
+begin
+ 
+   // 最多每秒重加载一次配置文件
+   if (Now() - log_initime) > (1/(24*60*60)) then
+     log_init();
+
+   //日志开头加时间
+   strline := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' ' + msg + #13#10;
+
+   //写到当天的日志文件中
+   log4me_addLog(log_filepath + FormatDateTime('yyyymmdd', Now) + '.log', PAnsiChar(strline));
+ 
+end;
+ 
+ 
+//-----下面4个是对外方法-------------------------
+ 
+function  log4filename():AnsiString;
+begin
+  Result := log_filename;
+end;
+ 
+procedure log4error(msg: AnsiString);
+begin
+  if log_doerror then
+     log4write('[error]' + msg);
+end;
+ 
+procedure log4info(msg: AnsiString);
+begin
+  if log_doinfo then
+    log4write('[info ]' + msg);
+end;
+ 
+procedure log4debug(msg: AnsiString);
+begin
+  if log_dodebug then
+    log4write('[debug]' + msg);
+end;
+
+procedure log4data(msg, sfile: AnsiString);  //写原始数据日志
+begin
+  //最多每秒重加载一次配置文件
+  if (Now() - log_initime) > (1/(24*60*60)) then
+    log_init();
+
+  //判断00字符串,增加回车换行
+  msg := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + ' [data]' + #13#10 + msg + #13#10#13#10;
+
+  //写到当天的日志文件中
+  log4me_addLog(sfile, PAnsiChar(msg));
+
+end;
+// ----------- 类初始化 -------------//
+initialization
+  InitializeCriticalSection(log_ThreadLock);
+  log_init;
+  log4info('log4me: 日志系统启动.');
+ 
+// ----------- 类销毁 -------------//
+finalization
+
+log4info('log4me: 日志系统停止.');
+DeleteCriticalSection(log_ThreadLock);
+if Assigned(log_fileStream) then
+  log_fileStream.Free;
+ 
+end.
\ No newline at end of file

--
Gitblit v1.9.3