// Написано щас , сами можете сделать как вам угоднее
// в разных случаях требуется по разному

var
  fileLog, fileInfo, fileError: String;
  ListInfoError: TStrings;
  
procedure LogInitialization;
begin
  fileLog := GetCurrentDir + '\fileLog.txt';
  fileInfo := GetCurrentDir + '\fileInfo.txt';
  fileError := GetCurrentDir + '\fileError.txt';
  ListInfoError := TStringList.Create;
end; {End LogInitialization}

procedure LogFinalization;
begin
  ListInfoError.Free;
  if FileExists(fileError) then
    ShellExecute('NotePad', fileError, False);
  if FileExists(fileInfo) then
    ShellExecute('NotePad', fileInfo, False);
end; {End LogFinalization}

procedure LogClear;
begin
  if FileExists(fileInfo) then
    DeleteFile(fileInfo);
  if FileExists(fileError) then
    DeleteFile(fileError);
end; {End LogClear}

procedure writeLog(Message: String);
begin
  writeLogFile(fileLog, Message);
end; {End writeLog}

procedure writeInfo(Message: String);
begin
  if ListInfoError.IndexOf(MD5String(Message)) < 0 then
  begin
    ListInfoError.Add(MD5String(Message));
    writeLogFile(fileInfo, Message);
    writeLog(Message);
  end;
end; {End writeInfo}

procedure writeError(Message: String);
begin
  if ListInfoError.IndexOf(MD5String(Message)) < 0 then
  begin
    ListInfoError.Add(MD5String(Message));
    writeLogFile(fileError, Message);
    writeLog(Message);
  end;
end; {End writeError}

begin
end.