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