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