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

Вниз

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

 
Tack   (2005-02-17 19:52) [0]

Какой вы предложите самый производительный способ ограничить размер лог-файла программы?

Условия задачи:
1) Файл простой текстовый (Text).
2) Файл всегда открывается для дозаписи (Append)
3) Каждая новая запись занимает ровно одну строку (один WriteLn)
4) Ограничение размера - в сотнях килобайт, удалять информацию можно только строками от начала файла.

Хотелось бы не перерасходовать память, загружая лог полностью в TStringList, а писать сразу на диск по 5-10 строк, после каждой группы вызовов WriteLn вызывая Flush.

Размер файла на диске можно контролировать через апишную GetFileSize(), получив дескриптор файла с правами на чтение.

А вот как эффективнее всего удалять лишние строки из начала файла при превышении размера?


 
Palladin ©   (2005-02-17 19:56) [1]


> Хотелось бы не перерасходовать память,

? сотней килобайт ты перерасходуешь память? парень, ты на какой машине работаешь...


 
begin...end ©   (2005-02-17 19:59) [2]

> Tack   (17.02.05 19:52)

> А вот как эффективнее всего удалять лишние строки из
> начала файла при превышении размера?

ИМХО, используя текстовые файлы (Text), сделать это эффективно не получится.


 
Tack   (2005-02-17 20:03) [3]

Так лучше через API файлы создавать?


 
begin...end ©   (2005-02-17 20:11) [4]

> Tack   (17.02.05 20:03) [3]

В файл записываются строки фиксированной длины?


 
Tack   (2005-02-17 20:14) [5]

неа. Все разные


 
begin...end ©   (2005-02-17 20:16) [6]

> Tack   (17.02.05 20:14) [5]

Тогда, вероятно, всё же придётся TStringList пользовать. ИМХО.


 
Tack   (2005-02-17 20:19) [7]

А как работает TStringList? Т.е. как он в памяти размещается? И будет ли влиять большая интенсивность записи строк в лог на общую производительность системы?


 
Aleks ©   (2005-02-17 20:21) [8]

procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
if (Если размер файла больше чем надо) then
begin
  Memo1.Lines.LoadFromFile("c:\txt.txt");
  for i:=0 to 3 do // сколько строк удалить, сейчас 3
   Memo1.Lines.Delete(i);
  Memo1.Lines.SaveToFile("c:\txt.txt");
end;
end;


 
Tack   (2005-02-17 20:23) [9]

Aleks, а если файл - 5-10 МБайт?


 
Германн ©   (2005-02-17 20:27) [10]

Дарю идею. Имя файла для лога формировать так:
DateToStr(Date).Имя программы.log.txt


 
Tack   (2005-02-17 20:30) [11]

Всем спасибо.


 
begin...end ©   (2005-02-17 20:31) [12]

> Tack   (17.02.05 20:19) [7]

> А как работает TStringList?

Ответ - в исходниках VCL :-)

Строки (а в TStringList с каждой строкой связан ещё и объект) там хранятся в поле-массиве. Т.е. для того, чтобы получить доступ к конкретной строке, не требуется чтение всех предыдущих строк (как в текстовом файле). При удалении какой-либо строки из списка все стоявшие ниже строки смещаются на одну вверх (это медленно), но в Вашем случае даже не надо ничего удалять. Как только выяснится, что размер списка слишком велик, начинайте писать в список сначала, т.е. перезаписывать строки, находящиеся в начале спсика. Но надо
ещё хорошо подумать, как часто этот список сохранять на диск...


 
Alexander Panov ©   (2005-02-17 21:46) [13]

Разбери пример, приведенный на  http://delphibase.spb.ru/ в разделе "Ini-, Log- и др. спецфайлы", вопросы отпадут.


 
Anatoly Podgoretsky ©   (2005-02-17 23:52) [14]

Tack   (17.02.05 20:23) [9]
А это много?


 
Германн ©   (2005-02-18 02:22) [15]

2 Anatoly Podgoretsky ©   (17.02.05 23:52) [14]
>Tack   (17.02.05 20:23) [9]
>А это много?

Для "разбора" лога с целью выяснения чего-то - много. Копаться в "многометровом" логе - не по силам! А ведь в логе нужно именно "копаться", иначе - зачем он нужен!

Кроме того в логе (по умолчанию) может "копаться" и юзер, который многого не знает! А, в добавок, этого самого юзера заставляют высылать лог по почте! И как быть с этими "метрами"?


 
Kerk ©   (2005-02-18 04:44) [16]


> Копаться в "многометровом" логе - не по силам! А ведь
> в логе нужно именно "копаться", иначе - зачем он нужен!

значит нужны средства для анализа этого лога. не просто текстовый редактор.

> Кроме того в логе (по умолчанию) может "копаться" и
> юзер, который многого не знает! А, в добавок, этого
> самого юзера заставляют высылать лог по почте! И как
> быть с этими "метрами"?

дык нужено высылать не весь лог... мелкософт же тебя просит не лог выслать..а отчет генерирует.


 
Shirson ©   (2005-02-18 07:26) [17]

>Aleks
 for i:=0 to 3 do // сколько строк удалить, сейчас 3
  Memo1.Lines.Delete(i);


Этот код удалит не первые три строки, а первую, третью, пятую и седьмую (итого четыре, кстати).

А вот этот - первые три:
 for i:=0 to 2 do
  Memo1.Lines.Delete(0);


 
Германн ©   (2005-02-19 02:11) [18]

>Kerk ©   (18.02.05 04:44) [16]

>> Копаться в "многометровом" логе - не по силам! А ведь
>> в логе нужно именно "копаться", иначе - зачем он нужен!

>значит нужны средства для анализа этого лога. не просто >текстовый редактор.

Нужны! Только вот разработка их почти соразмерна по времени и затратам с разработкой самой программы. А где взять деньги на оплату?

>> Кроме того в логе (по умолчанию) может "копаться" и
>> юзер, который многого не знает! А, в добавок, этого
>> самого юзера заставляют высылать лог по почте! И как
>> быть с этими "метрами"?

>дык нужено высылать не весь лог... мелкософт же тебя просит не >лог выслать..а отчет генерирует.

Дык! Мелкософт меня не просит. Но и не помогает. Может быть зарегистрированные юзеры Windows и могут сказать что-либо о помощи мелкософт при ошибках.
А вот генерация "отчета", на который вы ссылаетесь - есть прерогатива системы, т.е. Windows(читай Мелкософт). Т.о. они могут, а я нет!


 
Германн ©   (2005-02-19 02:27) [19]

К Германн ©   (19.02.05 02:11) [18]
Насчет "отчета".
Если я знаю и уверен в этом, что сейчас (где-то, когда-то) произошла ошибка, или программа сработала не так как нужно, или что-то еще, я сформирую вышеупомянутый "отчет". Только вот поможет ли он кому-нибудь? Без полного анализа лог-файла?


 
Anatoly Podgoretsky ©   (2005-02-19 09:57) [20]

Германн ©   (19.02.05 02:11) [18]
Тогда надо отказаться от идеи по причине отсутствия денег.


 
Anatoly Podgoretsky ©   (2005-02-19 10:03) [21]

Tack   (17.02.05 19:52)  
Могу дать рекомендацию по смене идеологии.
1. Отказаться от идеи усечения размера лога;
2. Вместо этого не усекать лог, а переименовывать его по окончанию периода (час, день, неделя, месяц);
3. В качестве имени старого лога использовать дату в форматированом виде, например как поступает Микрософт в MS SQL - yyyymmddhhnnss.log, для ежедневных yyyymmdd.log
4. определить срок хранения логов, по окончанию удалять.

И у тебя из твоих пунктов остаются только первые три и добавляются мои 2, 3 и 4
Скорость работы и требования к ресурсам великолепные.
Твой пункт 2 должен делаться для каждого добавления, каждой отдельной строки.

Концепции обработки могут быть любые, хоть заливать эти логи в SQL Server/File Server BD


 
Arm79 ©   (2005-02-19 10:24) [22]

Германн ©   (19.02.05 2:11) [18]
У меня при необходимости лог-файлы могут занимать и 200 мегабайт. Это когда в целях тестирования работы программы за весь день. Я тоже озаботился проблемой поиска нужной информации и сделал так. Программа пишет в лог исходя из опций, которые я задаю в инишнике. Их у меня штук 15. Например: ошибки, штатная работа программы, вызов функций из внешних модулей, отладочная информация и тд и тп.
Формат лога такой
[hh:nn:ss:zzz] tab [Option] tab [Message]

После чего мне не составило труда написать в течении пары часов анализатор по нужному мне времени и по нужным мне критериям.

Далее смотри
Anatoly Podgoretsky ©   (19.02.05 10:03) [21]
Логи у меня вормируются ежедневно. То есть в течении дня работа пишет всего в один файл лога. Имя такое [имя программы]_YYYY_mm_dd.log

История логов - 1 неделя. Определяю по времени модификации файлов. Все, чтостарее - удаляю.

PS В штатном режиме работы лог занимает порядка 50 кбайт


 
Anatoly Podgoretsky ©   (2005-02-19 10:28) [23]

Определение по времени неверно по сути, вся нужная информация находится в названии лога.


 
Anatoly Podgoretsky ©   (2005-02-19 10:31) [24]

Arm79 ©   (19.02.05 10:24) [22]
Вероятнее всего и название программы лишнее, разные логи хранить удобнее в разных папках, но если нужно в одной, то для удобства можно видоизменить формат на yyyymmdd_progname.log - хотя это и не важно.


 
Arm79 ©   (2005-02-19 17:13) [25]

Anatoly Podgoretsky ©
Определение по времени неверно по сути
Не совсем. Если я прихожу на следующий день, а мне говорят, что примерно в 15:00 программа сбойнула. Тогда я и смотрю во времени.

Вероятнее всего и название программы лишнее
Действительно, лишнее. Но кроме меня эти логи читают еще и другие люди. Эти логи расползаются по компам. Потому в названии лога присутствует имя программы. А почему не yyyymmdd_progname.log - потому что при сортировке по имени файла так удобнее смотреть.


 
Anatoly Podgoretsky ©   (2005-02-19 17:26) [26]

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


 
Anatoly Podgoretsky ©   (2005-02-19 17:28) [27]

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


 
Eraser ©   (2005-02-19 17:34) [28]

Tack

Зачем изобретать велосипед? Используй простенький движок БД, например QBase- просто, чётко, понятно и нет никакого перерасхода.
Можешь конечно и более крутые движки использовать, если информации много логировать надо...


 
Германн ©   (2005-02-20 01:44) [29]

2 AP
2 Arm79
А что вы предложили иное, чем:
Германн ©   (17.02.05 20:27) [10]
Дарю...

Ну разве что поместили имя программы перед датой, а не наоборот. Что, имхо, как некогда высказался Digitman - монопенисно!


 
Anatoly Podgoretsky ©   (2005-02-20 08:24) [30]

Ты запрещаешь другим писать сюда, даже если у них совет совпадает, ты не силшком много на себя берешь?
Не говоря уже о том, что ты читать не умеешь, не различаешь развернутые ответы от конспективных.
Может тебе в модераторы подписаться?


 
Anatoly Podgoretsky ©   (2005-02-20 08:27) [31]

Мы подискутировали о методах ведения логов, а единственным недовольным остался ты и ты почему то не автор вопрос, а посторонний читатель.


 
Arm79 ©   (2005-02-20 13:44) [32]

Германн ©   (20.02.05 1:44) [29]
Все сказал Anatoly Podgoretsky ©

imho некрасиво


 
Германн ©   (2005-02-21 03:11) [33]

2 Arm79 ©   (20.02.05 13:44) [32]

>Германн ©   (20.02.05 1:44) [29]
>Все сказал Anatoly Podgoretsky ©

>imho некрасиво

Пардон, а что некрасиво?
Сабж был о методе ведения лог-файла.
Автор сабжа в посте Tack   (17.02.05 20:23) [9]
спросил:
>Aleks, а если файл - 5-10 МБайт?
На что я ему ответил:
>Германн ©   (17.02.05 20:27) [10]
>Дарю идею. Имя файла для лога формировать так:
>DateToStr(Date).Имя программы.log.txt
Это однозначно определяет, что лог-файлы формируются по дням. В каждый день свой лог-файл.

После этого был некий треп о размерах,отчетах и алгоритмах.
Начиная с Anatoly Podgoretsky ©   (17.02.05 23:52) [14]
И заканчивая Anatoly Podgoretsky ©   (19.02.05 09:57) [20]
После того пошла рекомендация от АР:
>Anatoly Podgoretsky ©   (19.02.05 10:03) [21]
>Tack   (17.02.05 19:52)  
>Могу дать рекомендацию по смене идеологии.
>1. Отказаться от идеи усечения размера лога;
>2. Вместо этого не усекать лог, а переименовывать его по >окончанию периода (час, день, неделя, месяц);
>3. В качестве имени старого лога использовать дату в >форматированом виде, например как поступает Микрософт в MS SQL -> yyyymmddhhnnss.log, для ежедневных yyyymmdd.log
>4. определить срок хранения логов, по окончанию удалять.

>И у тебя из твоих пунктов остаются только первые три и >добавляются мои 2, 3 и 4
>Скорость работы и требования к ресурсам великолепные.
>Твой пункт 2 должен делаться для каждого добавления, каждой >отдельной строки.

Потом вы выступили с совместной дискуссией о времени/дате. Ну и ради бога, хотя суть её я не уловил.

После чего АП выразил неудовольствие моим постом. Причем сказал, что я кому-то, что-то запрещаю.

2 Анатолий Подгорецкий
Я различаю развернутые ответы от конспективных. Но Вам ли жаловаться на сей факт? Или конспективные ответы имеете право давать только Вы? А все остальные ДОЛЖНЫ давать только развернутые?

Кстати. В модераторы не подписываются. И уж это должно быть Вам известно! Иначе - полный ... Вы же "фидошник"!


 
Anatoly Podgoretsky ©   (2005-02-21 07:50) [34]

Ты ничего не путаешь, кто именно выразил недовольство?


 
Германн ©   (2005-02-22 01:56) [35]

>Anatoly Podgoretsky ©   (21.02.05 07:50) [34]
>Ты ничего не путаешь, кто именно выразил недовольство?

Имхо, ничего.
В моем посте Германн ©   (20.02.05 01:44) [29] было лишь недоумение поскольку после некоторого трепа начиная с
>Anatoly Podgoretsky ©   (17.02.05 23:52) [14]
Вы Анатолий закончили данное обсуждение постом

> Anatoly Podgoretsky ©   (19.02.05 10:03) [21]
>>Tack   (17.02.05 19:52)  
>>Могу дать рекомендацию по смене идеологии.
>>1. Отказаться от идеи усечения размера лога;
>>2. Вместо этого не усекать лог, а переименовывать его по >>окончанию периода (час, день, неделя, месяц);
>>3. В качестве имени старого лога использовать дату в >>форматированом виде, например как поступает Микрософт в MS SQL...

Моё недоумение касалось лишь того, что Вами был полностью проигнорирован мой пост, в котором (пусть конспективно), но все-таки был предложен вариант, который Вы развернуто предложили через двое суток после моего. А между этими событиями были и еше несколько "невразумительных" постов от Вас. Ну, например о деньгах и об отказе. Какие деньги? И от чего отказываться?
Мой пост "Германн ©   (19.02.05 02:11) [18]" говорил лишь о "несообразности" заниматься "разбором" логов путем разработки программ разборки логов, путем разработки программ чтения результатов программ разборки логов... и т.д.
Т.е.
 "Натуралистами открыты
  У паразитов паразиты
  И произвел переполох
  Тот факт, что блохи есть у блох.
  И обнаружил микроскоп,
  Что на клопе бывает клоп,
  Питающийся паразитом,
  На нем - другой, ad infinitum.

Дж.Свифт. "О поэзии" (1723)
В переводе С.Я.Маршака.



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

Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.072 c
8-1100767599
Сергей А
2004-11-18 11:46
2005.03.06
Фармат файлов MIDI


1-1109056083
Neznaika
2005-02-22 10:08
2005.03.06
DBGrid


1-1108558742
Gost
2005-02-16 15:59
2005.03.06
Как засунуть номер месяца в String из DateTimePicker?


1-1108562583
Manfred8
2005-02-16 17:03
2005.03.06
Шахматка и как ее сотворить?


1-1109018851
Object
2005-02-21 23:47
2005.03.06
Создание функций Undo и Redo.





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