Главная страница
    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.062 c
4-1232550179
Magedon
2009-01-21 18:02
2010.08.27
Как обновить часть экрана?


2-1274121959
Semen
2010-05-17 22:45
2010.08.27
Объединение 3-х полей таблицы Paradox в одно.


15-1273509185
stas
2010-05-10 20:33
2010.08.27
Рантайм пакеты


2-1267596769
ruslan_as
2010-03-03 09:12
2010.08.27
Как в Image отобразить участок IPG файла по координатам


15-1275337781
Юрий
2010-06-01 00:29
2010.08.27
С днем рождения ! 1 июня 2010 вторник





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