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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.067 c
2-1274530341
Delphist2
2010-05-22 16:12
2010.08.27
method insert класса range завершен неверно


15-1265917923
AlexDan
2010-02-11 22:52
2010.08.27
по php..


2-1269956469
sanya
2010-03-30 17:41
2010.08.27
Экспорт данных в StringGrid


15-1267337984
Kerk
2010-02-28 09:19
2010.08.27
Некачественное выполнение госконтракта


15-1264578016
pavel_guzhanov
2010-01-27 10:40
2010.08.27
нужна программа типа ErWin





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский