![]() |
| ||
|
|
Новости |
Поиск |
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;
------------------------------------------------
Sha (2004-08-10 10:55:00) [1]DeMoN_Astra (10.08.04 09:22) [30]
Это неплохая эмуляция окна :)
Главное достоинство - простота.
Если тебе
> нужно один файл, фиксированного размера
- используй завернутый через нулевую запись типизированный файл. Места на диске этим сильно не сэкономишь, т.к. надо рассчитывать на запись максимальной длины. При изменении требований на длину или количество записей могут возникнуть проблемы.
DeMoN_Astra (2004-08-10 09:22:00) [2]Но ведь это не окно :)
нужно один файл, фиксированного размера
Sha (2004-08-09 01:22:00) [3]Сначала пишешь в один файл. Как он заполнится (наберет N записей) - переключаешься на другой. Когда заполнится второй - снова пишешь в первый, и т.д. Получается, что в двух файлах ты всегда имеешь не менее N записей и не более 2N запмсей. Показываешь пользователю последние N.
DeMoN_Astra (2004-08-09 00:08:00) [4]Ничего не понял о двух файлах :)
поясню - нужно точь в точь, как в the bat файл событий организован..
Sha (2004-08-08 22:16:00) [5]Технология обрезания простая. Работаем с двумя файлами. В каждый пишем не более N записей. По мере надобности переключаемся на другой для перезаписи. Отображаем в окне последние N записей (из обоих файлов, рассматривая их как один непрерывный). При старте программы определяем текущий по дате изменения.
panov (2004-08-08 21:33:00) [6]>DeMoN_Astra (08.08.04 19:16) [25]
Более того - мне не нужно архивировать, мне нужно скользящее окно.. то бишь удаляем старые, пишем новые
Тогда используй TStringList, а о технологиях обрезания файла с начала я пока не слышал...
DeMoN_Astra (2004-08-08 19:16:00) [7]Хочу сам реализовать :)
Более того - мне не нужно архивировать, мне нужно скользящее окно.. то бишь удаляем старые, пишем новые
panov (2004-08-08 19:13:00) [8]>DeMoN_Astra (08.08.04 19:09) [23]
см. panov © (03.08.04 12:12) [10]
В реализованном классе обрабатывается условие максимальной длины журнала. При превышении текущий лог архивируется и начинается новый.
DeMoN_Astra (2004-08-08 19:09:00) [9]Хитро .. мдя..
а как держать файл событий постоянной длины?
Кириешки (2004-08-05 07:17:00) [10]>paa (05.08.04 06:32) [21]
Файлы по названию дыты?
А если ведется лог с 23:00 до допустим 02:00, то
1) Программа вылетает в том месте где написано append, потому что
эта функция добавляет в конец файла какую-то запись, а у
только-что созданного файла нет ни начала ни конца.
Если исправить эту ошибку, то
2) (как сказано из условия) будут созданы два файла. А это не очень удобно для последующего их изучения.
paa (2004-08-05 06:32:00) [11]Вот еще вариант для небольшего лога по суткам!
// записываем в файл
procedure TForm1.log(log_message:string);
var logfile :string;
F1:textfile;
begin
logfile:=datetostr(date)+'.log';
CreateFile(pChar(logfile),0,0,0,1,0,0);
AssignFile(F1,logfile);
Append(f1);
writeln(f1,log_message);
closefile(f1);
end;
// читаем из файла в memo
procedure TForm1.Timer1Timer(Sender: TObject);
begin
memo1.Lines.LoadFromFile(datetostr(date)+'.log');
end;
raidan (2004-08-03 13:45:00) [12]TUser © (03.08.04 12:39) [14]
Ну вы и привели пример :-/
В посимвольно считывать еще не пробовали?
Будет еще медленнее...
З.Ы. Достаточно один раз открыть файл и не закрывать его во время работы программы (если не боиться зависания и нужна быстрая скорость). Т.е. просто дописывать writeln'ом, по таймеру flush'ить изредка или даже не flush'ить :)
jao (2004-08-03 13:29:00) [13]Memo1.Lines.Delete[0] и правда жуууутттко тормозной оказался по замерам...
Кириешки (2004-08-03 12:58:00) [14]>TUser © (03.08.04 12:47) [17]
;))
TUser (2004-08-03 12:47:00) [15]Ну вот, самая важная наука для программера - археология :)
Кириешки (2004-08-03 12:45:00) [16]Удачи в разгребании.
jao (2004-08-03 12:41:00) [17]Спасибо всем!!! попробую теперь всё это разгрести
TUser (2004-08-03 12:39:00) [18]> Стирм зато грузит долго очень большие файлы!
Это не так. Стрим работает в дцать раз быстрее, чем ваш assignfile/rewrite/writeln. Например, попробуйте выполнять такие коды
while not eof(f) do begin
readln(f,s);
StrList.Add(s);
and;
и
StrList.LoadFromFile();
Второе - гораздо быстрее, потому что через стрим.
Кириешки (2004-08-03 12:38:00) [19]ЗЫ. ... и данные в файл пишет и мемо показывает (если нужно)
Кириешки (2004-08-03 12:35:00) [20]Сори, Меня долго небыло - вызывали.
>TUser © (03.08.04 11:53) [9]
Стирм зато грузит долго очень большие файлы!
Лично я делал примерно так :
procedure SomethingHappened(MyString:Pchar);
var
f : TextFile;
SappPath : string;
begin
SappPath := Extractfilepath(application.exename);
if FileExists(SappPath+'MyFilename.ext') then
begin
AssignFile(f,SappPath+'MyFilename.ext');
Reset(f);
Append(f);
Writeln(f,Mystring);
closefile(f);
end else
begin
AssignFile(f,SappPath+'MyFilename.ext');
Rewrite(f);
Append(f);
Writeln(f,Mystring);
closefile(f);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SomethingHappened(pchar(memo1.Lines.Text)); //Вызываем процедуру
Application.ProcessMessages();
if memo1.Lines.Count = 100 then
Memo1.Clear;
end;