📄 ufilelogger.pas
字号:
unit uFileLogger;
interface
uses
Windows, SysUtils, uCriticalSection, uException, uWin32Const;
type
TFileLogger = class
protected
m_sPath: String;
m_sData: String;
m_bLog: Boolean;
m_sFileName: String;
FLogFile: TextFile;
m_FileLogLock: TCriticalSection;
m_bErrorLog: Boolean;
m_sErrorFileName: String;
FLogErrorFile: TextFile;
m_FileLogErrorLock: TCriticalSection;
m_bReWriteFile: Boolean;
m_bShowProcessId: Boolean;
m_bShowThreadId: Boolean;
m_bShowDateTime: Boolean;
private
procedure InitFileLog;
function FormatMessage(const Msg: String): String;
published
property IsReWriteFile: Boolean read m_bReWriteFile write m_bReWriteFile;
property IsShowProcessId: Boolean read m_bShowProcessId write m_bShowProcessId;
property IsShowThreadId: Boolean read m_bShowThreadId write m_bShowThreadId;
property IsShowDateTime: Boolean read m_bShowDateTime write m_bShowDateTime;
public
procedure WriteLogMsg(const sMsg: String);
procedure WriteErrorLogMsg(const sMsg: String);
public
constructor Create;
destructor Destroy; override;
end;
var
_FileLogger: TFileLogger;
implementation
constructor TFileLogger.Create;
begin
inherited Create;
m_bReWriteFile := False;
m_bShowProcessId := TRUE;
m_bShowThreadId := TRUE;
m_bShowDateTime := TRUE;
m_bLog := FALSE;
m_bErrorLog := FALSE;
m_FileLogLock := TCriticalSection.Create;
m_FileLogErrorLock := TCriticalSection.Create;
InitFileLog;
end;
procedure TFileLogger.InitFileLog;
begin
m_sData := FormatDateTime('yyyymmdd', Now());
m_sPath := ExtractFilePath(ParamStr(0))+'Log';
if not DirectoryExists(m_sPath) Then CreateDir(m_sPath);
m_sFileName := ExtractFilePath(ParamStr(0))+'Log\'+m_sData+'.txt';
m_sErrorFileName := ExtractFilePath(ParamStr(0))+'Log\'+m_sData+'Error.txt';
try
AssignFile(FLogFile, m_sFileName);
if(FileExists(m_sFileName)) then
append(FLogFile)
else
rewrite(FLogFile);
m_bLog := True;
except
m_bLog := False;
raise TException.Create(ErrWin32Error, GetLastError(), 'WriteLogMsg');
end;
try
AssignFile(FLogErrorFile, m_sErrorFileName);
if(FileExists(m_sErrorFileName)) then
append(FLogErrorFile)
else
rewrite(FLogErrorFile);
m_bErrorLog := True;
except
m_bErrorLog := False;
raise TException.Create(ErrWin32Error, GetLastError(), 'WriteLogErrorMsg');
end;
end;
destructor TFileLogger.Destroy;
begin
FreeAndNil(m_FileLogLock);
FreeAndNil(m_FileLogErrorLock);
if m_bLog then CloseFile(FLogFile);
if m_bErrorLog then CloseFile(FLogErrorFile);
inherited Destroy;
end;
function TFileLogger.FormatMessage(const Msg: String): String;
var
ProcessID: String;
ThreadID: String;
begin
if m_bShowDateTime then
Result := FormatDateTime('hh:nn:ss:zzz',Now)+' ';
if m_bShowProcessId then begin
ProcessID := IntToStr(GetCurrentProcessID());
Result := Result + 'ProcessID: '+ ProcessID+' ';
end;
if m_bShowThreadId then begin
ThreadID := IntToStr(GetCurrentThreadID());
Result := Result + 'ThreadID: '+ ThreadID+' ';
end;
Result := Result + Msg;
end;
procedure TFileLogger.WriteLogMsg(const sMsg: String);
begin
try
m_FileLogLock.Lock;
Writeln(FLogFile, FormatMessage(sMsg));
flush(FLogFile);
finally
m_FileLogLock.UnLock;
end;
end;
procedure TFileLogger.WriteErrorLogMsg(const sMsg: String);
begin
try
m_FileLogErrorLock.Lock;
Writeln(FLogErrorFile, FormatMessage(sMsg));
flush(FLogErrorFile);
finally
m_FileLogErrorLock.UnLock;
end;
end;
initialization
_FileLogger := TFileLogger.Create;
finalization
_FileLogger.Free;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -