Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

как лучше огранизовать лог программы   Найти похожие ветки 

 
tippa   (2010-03-19 09:34) [0]

Вообщем написал програмку, и вот хочу потестировать пару суток. Думаю сделать ведение лога, где-то 1строка в секунду. Как это лучше сделать?  Постоянно хранить весь лог в строке и каждую секунду сбрасывать его на диск или дописывать строки через FileWrite?


 
И. Павел ©   (2010-03-19 09:38) [1]

Вот, к примеру, можно так: http://www.excode.ru/art5124p6.html

PS: Хотя с таким периодом (1 строка в секунду), наверное, можно как угодно - все равно серьезной потери производительности/памяти не будет.


 
Дмитрий Белькевич   (2010-03-19 11:57) [2]

Одна строка в секунду - это на современном железе ничто. Делай простую запись в файл.


 
KSergey ©   (2010-03-19 11:57) [3]

> И. Павел ©   (19.03.10 09:38) [1]

Странно, зачем автор этого кода пользуется TFileStream? Упражнялся?
Ведь обычный WriteLn ничуть не хуже по функциональности, а писанины - на порядок меньше.

С лог-файлами беды две:

а) накладные расходы, т.е. роизводительность
б) писать их без кеширования, т.к. иначе при падении программы мы можем потерять последние записи в файте, а это самое интересное.

Пункт б) решается либо каждый раз открывая/закрывая файл при записи очередной строки (как в приведенном коде), но это сильно усугубляет пункт а), либо открытием файла со спец. флажками.

Типа так, например

LogFile:Integer;

LogFile := CreateFile("file.log", GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);

...................

procedure WriteDebugInfo(const s:String);
const
    LOG_LINE_END = #13#10;
    LOG_DATETIME_FORMAT = "dd.mm.yyyy hh:nn:ss.zzz; ";
    LOG_BUF_STR_GROW_SIZE = 1024;
    log_buf_str: String = "";
var
    datetime_str: String;
    real_len, requerd_len, new_len: Integer;
    fwritten:DWORD;
begin
       try
           DateTimeToString(datetime_str, LOG_DATETIME_FORMAT, now());

           real_len := Length(datetime_str) + Length(s) + Length(LOG_LINE_END);
           requerd_len := real_len + 2; // #0

           if Length(log_buf_str) < requerd_len then
             begin
               new_len := ((requerd_len div LOG_BUF_STR_GROW_SIZE)+1) * LOG_BUF_STR_GROW_SIZE;
               SetLength(log_buf_str, new_len);
             end;

           StrPCopy(PChar(log_buf_str), datetime_str);
           StrPCopy(PChar(log_buf_str)+Length(datetime_str), s);
           StrPCopy(PChar(log_buf_str)+Length(datetime_str)+Length(s), LOG_LINE_END);

           SetFilePointer(LogFile,0,nil,FILE_END);
           WriteFile(LogFile, log_buf_str[1], real_len, fwritten , nil);
       except
       end;

end;


 
Юрий Зотов ©   (2010-03-19 16:11) [4]

> KSergey ©   (19.03.10 11:57) [3]

> Пункт б) решается либо каждый раз открывая/закрывая файл
> при записи очередной строки (как в приведенном коде), но
> это сильно усугубляет пункт а), либо открытием файла со
> спец. флажками.


Либо простым вызовом Flush. И тогда получим то самое:

> Ведь обычный WriteLn ничуть не хуже по функциональности,
> а писанины - на порядок меньше.


:o)



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

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
2-1265804991
Вася
2010-02-10 15:29
2010.08.27
A.V. при закрытии формы с TWebBrowser


2-1266403680
Незнайка на Луне
2010-02-17 13:48
2010.08.27
База данных по научным статьям


15-1274119662
Masolin_gazin
2010-05-17 22:07
2010.08.27
Как удалить сообщения программы?


2-1268502232
Loki3d
2010-03-13 20:43
2010.08.27
получить размер файла или папки


2-1274166166
pro_xaoc
2010-05-18 11:02
2010.08.27
Загружать изображение при наведении и кликании мышью