Главная страница
    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.071 c
15-1266485663
Guresff
2010-02-18 12:34
2010.08.27
Как организовать прием платежей на сайте?


15-1269360123
TUser
2010-03-23 19:02
2010.08.27
Генетика и геномика человека


15-1274364250
Sergey Masloff
2010-05-20 18:04
2010.08.27
Работа с RFID метками. Пробовал кто?


2-1275023269
Андрей Воронин
2010-05-28 09:07
2010.08.27
Как програмно открыть видео файл


2-1275805199
Denisrf
2010-06-06 10:19
2010.08.27
Не получается создать окно.





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