Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Вниз

Как правильно вести лог событий работы программы?   Найти похожие ветки 

 
Ezorcist   (2007-04-15 01:07) [0]

Можно в начале работы программы обращаться к текстовому файлу
assignfile(f,"log.txt);
а потом при каждом событии, которое необходимо записать в лог делать соотв. запись в файл:
writeln(f,str);
А в коне программы закрывать файл closefile(f);

Но если программы будет завершена неверно (т.е. как следствие не будет выполнено closefile(f); ), то часть данных, как я понял может потеряться.

Как предотвратить потерю этих данных или же можно вести лог другим более правильным способом?


 
Германн ©   (2007-04-15 01:15) [1]


> Ezorcist   (15.04.07 01:07)
>
> Можно в начале работы программы обращаться к текстовому
> файлу
> assignfile(f,"log.txt);
> а потом при каждом событии, которое необходимо записать
> в лог делать соотв. запись в файл:
> writeln(f,str);
> А в коне программы закрывать файл closefile(f);
>
> Но если программы будет завершена неверно (т.е. как следствие
> не будет выполнено closefile(f); ), то часть данных, как
> я понял может потеряться.
>
> Как предотвратить потерю этих данных или же можно вести
> лог другим более правильным способом?
>

AssignFile тут вообще ни при чём. Имеют значение только Reset, Rewrite, Append & CloseFile.


 
Джо ©   (2007-04-15 03:39) [2]

> [0] Ezorcist   (15.04.07 01:07)
> Как предотвратить потерю этих данных или же можно вести
> лог другим более правильным способом?

Можно, например, закрывать файл после каждой записи и открывать снова, когда нужно. Можно, например, делать принудительный Flush. Да мало ли чего еще можно, например.


 
Плохиш ©   (2007-04-15 04:20) [3]


> Ezorcist   (15.04.07 01:07)  

Нннаа, ик... дарю...ик

type
 TLogFile = class
   FFileName:  String;
   FLogBuf:    TStrings;

   public
     constructor Create(AFileName: String = "");
     destructor  Destroy; override;
     procedure   Add(AStrLog: String); virtual;
     procedure   AddStr(AStrLog: String); virtual;
     procedure   AddValue(AName: String; AValue: Variant; AOhneTime: Boolean = false); virtual;
     procedure   AddDynArr(AName: String; AValue: TByteDynArray; AOhneTime: Boolean = false); overload;
     procedure   AddDynArr(AName: String; AValue: TShortIntDynArray; AOhneTime: Boolean = false); overload;
     procedure   Save; virtual;
     property    LogBuf: TStrings read FLogBuf;
 end;
....
{ TLogFile }

procedure TLogFile.Add(AStrLog: String);
begin
 FLogBuf.Add(FormatDateTime(""["dd/mm/yyyy" - "hh:nn:ss"] "", now) + AStrLog);
end;

procedure TLogFile.AddStr(AStrLog: String);
begin
 FLogBuf.Add(AStrLog);
end;

procedure TLogFile.AddValue(AName: String; AValue: Variant; AOhneTime: Boolean);
var
   sValue: String;
begin
 sValue := VarToStr(AValue);
 sValue := AName + " = " + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

procedure TLogFile.AddDynArr(AName: String; AValue: TByteDynArray;
 AOhneTime: Boolean);
var
   sValue: String;
   lIndex: Integer;
begin
 sValue := "";
 for lIndex := Low(AValue) to High(AValue) do
   sValue := sValue + chr(AValue[lIndex]);
 sValue := AName + " = " + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

procedure TLogFile.AddDynArr(AName: String; AValue: TShortIntDynArray;
 AOhneTime: Boolean);
var
   sValue: String;
   lIndex: Integer;
begin
 sValue := "";
 for lIndex := Low(AValue) to High(AValue) do
   sValue := sValue + chr(byte(AValue[lIndex]));
 sValue := AName + " = " + sValue;
 if AOhneTime then AddStr(sValue) else Add(sValue);
end;

constructor TLogFile.Create(AFileName: String);
begin
 inherited Create;
 if AFileName = "" then  FFileName := cLogFile
 else if ExtractFilePath(AFileName) <> "" then FFileName := AFileName
 else
{$IFDEF MSWINDOWS}
   FFileName := IncludeTrailingPathDelimiter(GetEnvironmentVariable("temp")) + AFileName;
{$ENDIF}
{$IFDEF LINUX}
   FFileName := "/tmp/" + AFileName;
{$ENDIF}
 FLogBuf := TStringList.Create;
 TStringList(FLogBuf).Sorted := false;
end;

destructor TLogFile.Destroy;
begin
 if FLogBuf.Count > 0 then Save;
 FLogBuf.Free;
 inherited;
end;

procedure TLogFile.Save;
var
   FOut:     TStream;
   bCreated: Boolean;
begin
 bCreated := false;
 FOut := nil;
 if not FileExists(FFileName) then
   FOut := TFileStream.Create(FFileName, fmCreate)
 else
   repeat
     try
       FOut := TFileStream.Create(FFileName, fmOpenReadWrite + fmShareExclusive);
       bCreated := true;
     except
       on EFOpenError do Sleep(500)
       else raise;
     end;
   until bCreated;
 try
   FOut.Seek(0, soFromEnd);
   FLogBuf.SaveToStream(FOut);
   FLogBuf.Clear;
 finally
   Fout.Free;
 end;
end;


 
Ezorcist   (2007-04-15 11:15) [4]


> лохиш ©   (15.04.07 04:20) [3]
>
>
> > Ezorcist   (15.04.07 01:07)  
>
> Нннаа, ик... дарю...ик


Мамма-мия )) СПАСИБО!)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.058 c
8-1155671586
Denisich
2006-08-15 23:53
2007.05.06
DSPack


2-1176459620
Romm
2007-04-13 14:20
2007.05.06
Вопросик...


2-1176461923
tstubaks
2007-04-13 14:58
2007.05.06
Проблема с кодировкой


2-1176464297
ppcumax
2007-04-13 15:38
2007.05.06
Как получить страницу после поста


8-1156315403
Maxim new
2006-08-23 10:43
2007.05.06
Ассоциация файлов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский