![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
логер работы программы [D7, Win95/98, Win2k, WinXP]
jao © (2004-08-03 10:55:00)Логи работы программы записываются в Memo1:TMemo, приблизительно раз в сто строк (в зависимости от количества строк на экане) логи
скидываются в файл на диск (если файла лога нет - он создается, если есть - дописывается в конец). Программа работает круглосуточно и несколько раз в сутки вылетает сообщение о том, что файл лога не доступен или заблокирован другой программой, хотя никто кроме этой проги его не юзает.
Как можно обойти данную траблу или как можно сделать логер по-другому? кто нает :(
-----------------------------------------------------------
procedure TFormMD.Memo1Change(Sender: TObject);
var
CountSaveLines:integer;
fs:TFileStream;
LogName:string;
i:integer;
m:word;
TempStrings:TStringList;
WasOpenError:boolean;
begin
WasOpenError:=false;
if memo1.Lines.Count>100 then
begin
LogName:=extractfilepath(application.ExeName)+'Logs\'+formatdatetime('dd_mm_yyyy', now)+'_'+inttostr(LogIndex)+'.log';
if fileExists(LogName)
then
begin
m:=fmOpenReadWrite
end
else
begin
m:=fmCreate;
end;
fs:=TFileStream.Create(LogName,m);
fs.Seek(0, soFromEnd);
TempStrings:=TStringList.Create;
TempStrings.BeginUpdate;
memo1.Lines.BeginUpdate;
CountSaveLines:=memo1.Height div (memo1.Font.Height - 3);
for i:=0 to 100+(CountSaveLines) do
begin
TempStrings.Add(memo1.Lines.Strings[0]);
memo1.Lines.Delete(0);
end;
TempStrings.SaveToStream(fs);
memo1.Lines.EndUpdate;
TempStrings.EndUpdate;
TempStrings.Free;
fs.Free;
end;
end;
------------------------------------------------
panov (2004-08-03 12:13:00) [21]Журнал можно просматривать во время работы программы...
panov (2004-08-03 12:12:00) [22]http://home.ural.ru/~panov/dll_src/new/readme.txt
Тут есть реализованный журнал в DLL и отдельном потоке.
TUser (2004-08-03 11:53:00) [23]Сразу в файл можно записыватьчерез FileStream методом Write. Строки записываются посимвольно, перед каждой строкой - Integer значение (дляна строки). См. статьи А.Подгорецкого на Королевстве, + любая другая литература по Delphi.
Erik1 (2004-08-03 11:47:00) [24]Однозначно лучше писать сразу в фаил. TFileSteream можно неиспользовать, тогда и уничтожать ненадо. А паралельно можно выводить в лог.
procedure TRealEvent.Close;
begin
FileActive := False;
{$I-}
Flush(F);
CloseFile(F);
{$I+}
end;
procedure TRealEvent.Log;
Var Buf: String;
Const LogFile = 'C:\UDPLog.txt';
begin
Buf := Format('%d;%d;%d;%d;',[DecNoToInt(Params.Decoder),Params.Cmd,
fConf.Code, fConf.Content]);
if not FileActive then begin
AssignFile(F,LogFile);
{$I-}
Reset(F);
{$I+}
IOResult;
if Not FileExists(LogFile) then
Rewrite(F);
FileActive := True;
end;
Append(F);
Writeln(F,Buf);
end;
jao (2004-08-03 11:45:00) [25]>Кириешки
Приведи, плз, пример того каким способом ты пишешь сразу в файл
ЗЫ: А не будет ли это сильно тормозить систему и постоянно грузить диск?
TUser (2004-08-03 11:40:00) [26]Программа просматривает фалы на ftp сервере. Файлы организованы в большое кол-во папок. Для каждой папки - свой лог.
jao (2004-08-03 11:39:00) [27]>TUser
Если делать Clear, то юзверь не увидит последних записей, а это есь плохо, попробую try ... finally, хотя вроде там нет опасных участков, где может быть эксепшн...вот бы научиться разблокировать заблокированный файл :)))
Кириешки (2004-08-03 11:38:00) [28]>TUser © (03.08.04 11:30) [3]
А для чего большое кол-во файлов надо, в которых лог пишется?
Обычно лог делается суточный или несколькочасовой, а зетем новый файл делается.
TUser (2004-08-03 11:30:00) [29]Не всегда это проще. У меня сейчас вот работает прога, которая логи ведет, записывается в файл и мему. Очень удобно сразу видеть чего она пишет. Делал примерно так
procedure AddToLog(S:string);
begin
Memo1.Lines.Add;
if assigned(FLog) then
{пишем S В FLog}
end;
procedure NewLog;
begin
if assigned(FLog);
then Freeandnil(FLog);
FLog:=TFileSteream.Create;
end;
Правда у меня лог организован в виде большого кол-ва файлов, после открытия каждый закрывается минут через 30-40.
Кириешки (2004-08-03 11:25:00) [30]А не проще писать сразу в файл? Для этого есть функция Append, она записывает "что-то" в конец файла. Я так делал, когда уезжал в Крым, а за моим компом оставались люди. Она тоже "круглосуточно" работала. А потом приехал и почитав файл узнал что они делали на компе в мое отсутствие. Правда файл - большой-большой был 20 мегов. Его доже Ворд грузить отказался (сказав что стек переполнен). Пришлось частями грузить.
TUser (2004-08-03 11:04:00) [31]TempStrings.BeginUpdate;
memo1.Lines.BeginUpdate;
CountSaveLines:=memo1.Height div (memo1.Font.Height - 3);
Вот этот участок кода точно нуждается в переписывании. И Memo1.Lines.Delete[0] - не самая быстрая операция, лучше потом сделать ему Clear. Переписать здесь надо много.
А вообще может статься, например, что где-то происходит ошибка, FileStream не уничтожается, поэтому файл оказывается занятым. Это первое, что в голову пришло. Вообще, всегда лучше писать try ... finally, если надо, чтобы объект гарантированно уничтожался.