Организация записи в лог-файл
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Организация записи в лог-файл
На удаленном компьютере работает программа.
Ее действия записываются в лог-файл. События могут происходить с частотой от нескольких раз в секунду до десятков минут.
Принцип сохранения следующий: Т.е. при запуске программы создается текстовый файл (имя файла - дата и время создания). Затем в бесконечном цикле обрабатываются события и результаты записываются в лог-файл.
Файл сохраняется на раздел диска, который синхронизирован с облачным хранилищем.
Таким образом я могу отслеживать работу удаленной программы с любого компьютера.
Все было бы хорошо, но есть НО.
Файл создается с "0" размером и это логично. В процессе записи размер файла не увеличивается, а соответственно я не могу отследить состояние в котором находится программа в режиме реального времени. Реально данные записанные в файл, а соответственно и размер файла, изменяются только после закрытия ссылки на файл (закрытия сессии).
Возможно это особенности файловой системы Ext4 (Linux), на Windows не проверял, но думаю там аналогично все происходит.
Собственно вопрос: Каким образом можно обойти описанную проблему не используя закрытие файла? А то мне не очень нравится идея его периодического открытия и закрытия.
Ее действия записываются в лог-файл. События могут происходить с частотой от нескольких раз в секунду до десятков минут.
Принцип сохранения следующий: Т.е. при запуске программы создается текстовый файл (имя файла - дата и время создания). Затем в бесконечном цикле обрабатываются события и результаты записываются в лог-файл.
Файл сохраняется на раздел диска, который синхронизирован с облачным хранилищем.
Таким образом я могу отслеживать работу удаленной программы с любого компьютера.
Все было бы хорошо, но есть НО.
Файл создается с "0" размером и это логично. В процессе записи размер файла не увеличивается, а соответственно я не могу отследить состояние в котором находится программа в режиме реального времени. Реально данные записанные в файл, а соответственно и размер файла, изменяются только после закрытия ссылки на файл (закрытия сессии).
Возможно это особенности файловой системы Ext4 (Linux), на Windows не проверял, но думаю там аналогично все происходит.
Собственно вопрос: Каким образом можно обойти описанную проблему не используя закрытие файла? А то мне не очень нравится идея его периодического открытия и закрытия.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Организация записи в лог-файл
Не очень хорошо долго держать открытый файл. Практика показывает, что это чревато проблемами. Например, при нештатном закрытии программы файл может оказаться недоступным до перезагрузки компа. Также, пока файл не закрыт, его невозможно просмотреть, это неудобно.
Решая подобную задачу я пришел к следующим вещам:
1. необходима буферизация данных на запись. По достижении определенного количества записей в буфере, открывается файл, буфер скидывается и файл закрывается.
2. таймаут добавления данных в буфер, при достижении которого выполняется пункт 1. Предотвращает ситуацию, когда данные лежат в буфере, например, час и приложение завершается нештатно, в результате чего данные пропадают.
3. по команде завершения программы также выполняется пункт 1
Решая подобную задачу я пришел к следующим вещам:
1. необходима буферизация данных на запись. По достижении определенного количества записей в буфере, открывается файл, буфер скидывается и файл закрывается.
2. таймаут добавления данных в буфер, при достижении которого выполняется пункт 1. Предотвращает ситуацию, когда данные лежат в буфере, например, час и приложение завершается нештатно, в результате чего данные пропадают.
3. по команде завершения программы также выполняется пункт 1
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Организация записи в лог-файл
Думаю, что так и есть.IvanLis писал(а):Возможно это особенности файловой системы Ext4 (Linux)
Одна из особенностей ext4:
Почитайте:wikipedia писал(а):Отложенное выделение блоков (англ. delayed allocation). Выделение блоков для хранения содержимого файла происходит непосредственно перед записью на диск (например, при вызове sync), а не при вызове write. Из-за этого блоки можно выделять не по одному, а группами, что в свою очередь минимизирует фрагментацию и ускоряет процесс выделения блоков. С другой стороны, увеличивается риск потери данных в случае внезапного пропадания питания.
https://ru.wikipedia.org/wiki/Ext4
http://habrahabr.ru/post/58183/
Отложенное выделение места
Что касается Windows, то это уже обсуждалось здесь. Попробуйте использовать Flush FIle.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Организация записи в лог-файл
Это, то что доктор прописалdadreamer писал(а):Попробуйте использовать Flush FIle.
Zx_K9fAtIT8
И к стати, это не зависит от файловой системы, по крайней мере сейчас проверил на Windows.
NTFS и FAT32 ведут себя аналогично.
Видимо это именно буфер создает.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Организация записи в лог-файл
На маленьких объёмах данных (< 4 КБ) нет смысла проверять, т.к. данные могут лежать в кэше ОС и просто не записываться на жёсткий диск. Когда размер блока данных становится более или равен 4 КБ, то он точно должен скидываться на диск, по крайней мере на NTFS в Windows.IvanLis писал(а):И к стати, это не зависит от файловой системы, по крайней мере сейчас проверил на Windows.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Организация записи в лог-файл
Проверьте вот такой :
На Windows размер файла и количество записанных данных строго совпадает. Это означает, что даже несмотря на небольшой размер файла, сведения о нём обновляются в MFT при каждой операции записи. Интересно, что будет показывать в Linux.-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Организация записи в лог-файл
dadreamerПопробуйте использовать Flush FIle.На маленьких объёмах данных (< 4 КБ) нет смысла проверять, т.к. данные могут лежать в кэше ОС и просто не записываться на жёсткий диск.
IvanLis, а ты не обратил внимание, что скорость записи падает в десятки раз, если ставить Flush File? Если это не кретично, то используйте.IvanLis писал(а):Это, то что доктор прописал
У меня лично стоит Win7 x64 Ultimate и у меня нет проблем с Вашим первым вариантом. То есть я пишу данные и постоянно отслеживаю размер файла - он меняется. И меняется, даже если его размер менее 4 кБ(то есть меньше размера кластера на диске).
А ты не пробовал использовать функцию Get File Size Function? Прекрасно определяет размер файла в текущий момент. Проводи опрос каждые N мс при необходимости.IvanLis писал(а):Реально данные записанные в файл, а соответственно и размер файла, изменяются только после закрытия ссылки на файл (закрытия сессии).
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Организация записи в лог-файл
Не факт, что у него будет так же, в ext4 вообще нет MFT: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout А что касается винды, то когда файл или его сектор меньше 4 КБ, то он болтается в кэше и обновляется только запись в MFT (размер, в том числе). Как только сектор превысил 4 КБ, то он копируется в область файловых данных, запись MFT обновляется и снова по кругу. Сейчас нет времени разбираться, как работает ext4, для проверки я выложил выше .
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Организация записи в лог-файл
Я написал, что происходит на моей машине под Windows. Я наблюдаю изменение размера файла через свойства файла и через Get File Size Function.vi в LabVIEW.Не факт, что у него будет так же, в ext4 вообще нет MFT
Чет я не понял на счет кэша. Получается что запись ведется и в файл и в кэш-память что ли? Или из кэша данные копируются тогда и только тогда, когда размер данных равен размеру кластера? А до этого что, файл пустым находится?
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Организация записи в лог-файл
У меня так же:Vitekkz88 писал(а):Я написал, что происходит на моей машине под Windows. Я наблюдаю изменение размера файла через свойства файла и через Get File Size Function.vi в LabVIEW.
Винда такая же точно - W7 x64 Ultimate.dadreamer писал(а):На Windows размер файла и количество записанных данных строго совпадает. Это означает, что даже несмотря на небольшой размер файла, сведения о нём обновляются в MFT при каждой операции записи.
Да.Vitekkz88 писал(а):Или из кэша данные копируются тогда и только тогда, когда размер данных равен размеру кластера?
Физически да, пуст или недозаписан на тот объем информации, что некратен 4 КБ. Если в такой момент выдернуть питание компьютера, то данные потеряются.Vitekkz88 писал(а):А до этого что, файл пустым находится?
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Организация записи в лог-файл
dadreamer, чет я запутался
Скорее он недозаписан до размера кластера, чем просто пуст.
Размер файла увеличивается до значения, кратного 4 кБ(размер кластера). То есть если мы записали 4 байта данных, то размер файла будет 4 кБ. Если записали 4.1 кБ, то размер файла выравнивается до 8 кБ и т.д.
Тем не менее, если данные копируются из кэша по 4 кБ, а до этого момента файл "как бы" пустой, то что тогда мы видим в файле? А видим там реально записанные данные. Значит файл просто недозаписан на объем информации размера кластера. И данные из кэша выгребаются более мелкими порциями вплоть до байта, не? Вон, я записал 2 числа uint32 - в итоге в файл положилось 8 байт.
То есть если в процессе записи этих скудных байт я вырублю питание - то всё пропало? А если я просто LabVIEW из диспетчера задач закрою - тоже всё пропало? Или убив процесс - данные будут продолжать выгребаться из памяти в файл?
Скорее он недозаписан до размера кластера, чем просто пуст.
Размер файла увеличивается до значения, кратного 4 кБ(размер кластера). То есть если мы записали 4 байта данных, то размер файла будет 4 кБ. Если записали 4.1 кБ, то размер файла выравнивается до 8 кБ и т.д.
Тем не менее, если данные копируются из кэша по 4 кБ, а до этого момента файл "как бы" пустой, то что тогда мы видим в файле? А видим там реально записанные данные. Значит файл просто недозаписан на объем информации размера кластера. И данные из кэша выгребаются более мелкими порциями вплоть до байта, не? Вон, я записал 2 числа uint32 - в итоге в файл положилось 8 байт.
То есть если в процессе записи этих скудных байт я вырублю питание - то всё пропало? А если я просто LabVIEW из диспетчера задач закрою - тоже всё пропало? Или убив процесс - данные будут продолжать выгребаться из памяти в файл?
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Организация записи в лог-файл
Уважаемые коллеги! Хочу обратить ваше внимание на то, что в данном случае файл содержит логи. Для того, чтобы набрать 4кб логов, надо долго работать. Не факт что за сутки столько информации наберется. Поэтому лично я считаю, что в данном случае держать открытый файл - не лучшее решение.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Организация записи в лог-файл
Просматривать я могу без проблем(именно что касается текстового файла). Открываю и смотрю, какие данные записались->закрываю файл-> открываю вновь->смотрю. В это время запись данных из LabVIEW не прекращается.Borjomy_1 писал(а):
...пока файл не закрыт, его невозможно просмотреть, это неудобно...лично я считаю, что в данном случае держать открытый файл - не лучшее решение.
Другое дело, если я этот файл пытаюсь переместить в другую директорию в процессе записи - это да, не получится.
Вы предлагали буферизировать данные совместно с таймаутом. Это рабочее решение, единственный недостаток - необходимость подобрать тайм-аут и учесть как часто могут прилетать сообщения. Тут же возникает вопрос: не возникнет ли каких-либо коллизий при постоянном открытии/записи/закрытии файла?
В целом за свою практику не встречал проблем с долго открытым или занятым файлом...Единственно, что не удавалось его перетащить сразу на флешку...приходилось делать копию.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Организация записи в лог-файл
За сутки набирается порядка 30кб .Borjomy_1 писал(а):Уважаемые коллеги! Хочу обратить ваше внимание на то, что в данном случае файл содержит логи. Для того, чтобы набрать 4кб логов, надо долго работать. Не факт что за сутки столько информации наберется. Поэтому лично я считаю, что в данном случае держать открытый файл - не лучшее решение.
Сделал следующим образом: в EventCase по таймеру, раз в 30 секунд выполняю Flush FIle.
Открытым его держать не очень, согласен, т.к. потери данных возможны при аварийном завершении, но в последнем случае мы потеряем данные только за последние 30 сек.
А вот открывать и закрывать его мне вообще не нравится, т.к. локальная папка в которой расположен файл постоянно синхронизируется с облаком, а это черевато косяками, можно потом его и не отыскать вообще, по этому и описал проблему.
В теорию работы файловой системы сейчас тоже не хочется вникать, да и времени нет.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Организация записи в лог-файл
Vitekkz88, да, я похоже поторопился с ответом. Физически на диск пишется каждый байт, просто маленькие файлы (до 4 КБ) хранятся прямо в MFT, а побольше - в основной файловой области. Так что ваша правда:
Есть ещё один интересный момент - если выставить вход Open/Create/Replace File disable buffering в True, то файл будет писаться на диск, минуя кэш Windows. В некоторых случаях это даёт прирост в производительности. Однако запись должна производиться блоками, кратными размеру сектора диска (512 байт), иначе выдаст ошибку.
Похоже, что не использует внутреннюю программную буферизацию, и для работы с файлами используются только стандартные вызовы WinAPI. Если, к примеру, взять другие IDE, например Delphi, то там данные в файл не пишутся, пока не накопится некоторый объем данных. Для физической записи на диск нужно делать FlushFile или сразу CloseFile.Vitekkz88 писал(а):данные из кэша выгребаются более мелкими порциями вплоть до байта
Оказалось, что нет. Во всех трёх вариантах файл физически пишется на диск. Похоже, что закон сохранения энергии справедлив и для файлов (по крайней мере на NTFS под Windows): "Ничто не появляется из ниоткуда, и не исчезает в никуда"Vitekkz88 писал(а):То есть если в процессе записи этих скудных байт я вырублю питание - то всё пропало? А если я просто LabVIEW из диспетчера задач закрою - тоже всё пропало? Или убив процесс - данные будут продолжать выгребаться из памяти в файл?
Есть ещё один интересный момент - если выставить вход Open/Create/Replace File disable buffering в True, то файл будет писаться на диск, минуя кэш Windows. В некоторых случаях это даёт прирост в производительности. Однако запись должна производиться блоками, кратными размеру сектора диска (512 байт), иначе выдаст ошибку.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 6 Ответы
- 1646 Просмотры
-
Последнее сообщение ladik
-
- 4 Ответы
- 958 Просмотры
-
Последнее сообщение jane_wild
-
- 12 Ответы
- 600 Просмотры
-
Последнее сообщение Sergey Puzanov