{------------------------------------------------------------------------------} {ÏîÄ¿Ãû³Æ£ºÈÕÖ¾µ¥Ôª } {µ¥ÔªÃû³Æ£º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.