⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufilelogger.pas

📁 楠楠写的DBiocp例子都是源码
💻 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 + -