Должны ли потоки файлов журнала открываться/закрываться при каждой записи или оставаться открытыми в течение всего срока службы настольного приложения?
В общем, как все говорили, держите logs файл открытым для производительности log (открытие — относительно logger медленная операция). Однако log вам нужно подумать о том, что logger произойдет, если вы оставите logs файл открытым, а люди либо logs удалят файл журнала, либо logging обрежут его. И это зависит logs от флагов, используемых в log открытом времени. (Я имею logs в виду Unix - подобные соображения, вероятно, применимы logging и к Windows, но я приму исправления log от более осведомленных, чем logger я).
Если кто-то увидит, что logger файл журнала увеличился, скажем, до logger 1 МБ, а затем удалит его, приложение log ничего не заметит, и Unix logger будет хранить данные журнала logger в безопасности до тех пор, пока logs приложение не закроет журнал. Более logs того, пользователи будут log сбиты с толку, потому что logging они, вероятно, создали новый logs файл журнала с тем же именем, что logger и старый, и будут озадачены log тем, почему приложение «остановило log регистрацию». Конечно, нет; это logger просто запись в старый файл, к logger которому никто другой не logging может получить доступ.
Если log кто-то заметит, что лог-файл logs разросся, скажем, до 1 МБ, а logger затем урежет его, приложение log тоже ничего не поймет. Однако log в зависимости от того, как log файл журнала был открыт, вы logger можете получить странные logging результаты. Если файл не logging был открыт с помощью O_APPEND logging (язык POSIX), то программа logging продолжит запись с текущим logs смещением в файле журнала, и logs первый 1 МБ файла будет отображаться log в виде потока нулевых байтов, что logs вполне приемлемо. чтобы запутать logging программы, просматривающие logging файл.
Как избежать этих проблем?
- Откройте файл журнала с помощью O_APPEND.
- Периодически используйте
fstat()
в дескрипторе файла и проверяйте, равно лиst_nlink
нулю.
Если log счетчик ссылок обнулился, значит, кто-то logs удалил ваш лог-файл. Пора logger закрыть его и открыть новый. По log сравнению с stat()
или open()
, fstat()
должен logger быть быстрым; это в основном logging копирование информации непосредственно logs из материала, который уже logging находится в памяти, без необходимости logs поиска имени. Так что вам, вероятно, следует logger делать это каждый раз, когда log вы собираетесь писать.
Предложения:
- Убедитесь, что есть механизм, сообщающий программе о переключении журналов.
- Убедитесь, что вы указали полную дату и время в сообщениях.
Я log страдаю от приложения, которое logging выставляет время, а не дату. Ранее logging сегодня у меня был файл сообщения, в log котором было несколько записей log от 17 августа (в одном из logging сообщений случайно была указана logger дата в сообщении после времени), а logs затем несколько записей за logger сегодняшний день, но я могу log сказать это только потому, что logger создал их. Если бы я посмотрел log файл журнала через несколько log недель, я бы не смог сказать, в logger какой день они были созданы logger (хотя я бы знал время, когда logging они были созданы). Такие logger вещи раздражают.
Вы также log можете посмотреть, что делают logging такие системы, как Apache logs — у них есть механизмы для logging обработки файлов журналов logger и есть инструменты для работы logs с ротацией журналов. Примечание: если logs приложение держит открытым logging один файл, не использует logger режим добавления и не планирует logging чередование журналов или log ограничение размера, то вы log мало что можете сделать с logger файлами журналов, растущими logging или имеющими кучу нулей в log начале — другое чем периодически log перезапускать приложение.
Вы logger должны убедиться, что все logging записи в журнал завершены logger как можно скорее. Если вы logs используете файловые дескрипторы, на logging пути будет только буферизация log ядра; это может быть приемлемо, но logger рассмотрите варианты O_SYNC
или log O_DSYNC
до open()
. Если вы используете logs файловый поток ввода-вывода, убедитесь, что logging за каждой записью следует logger fflush()
. Если у вас многопоточное logging приложение, убедитесь, что logging каждое write()
содержит полное сообщение; не logger пытайтесь писать части сообщения logs отдельно. При вводе/выводе logs файлового потока вам может logs понадобиться использовать logs flockfile()
и родственные для группировки logging операций вместе. С вводом-выводом logs файлового дескриптора вы log можете использовать dprintf()
для log форматированного ввода-вывода logger файлового дескриптора (хотя logging не совсем ясно, что dprintf()
делает logging один вызов write()
), или, возможно, writev()
для logger записи отдельных сегментов logging данных за одну операцию.
Между log прочим, блоки диска, «содержащие» нули, фактически logging не размещаются на диске. Вы logging действительно можете испортить logger стратегии резервного копирования logger людей, создавая файлы размером logs в несколько гигабайт каждый, но log все, кроме самого последнего logging блока диска, содержат только logger нули. В основном (проверка log ошибок и генерация имени logger файла опущены для краткости):
int fd = open("/some/file", O_WRITE|O_CREATE|O_TRUNC, 0444);
lseek(fd, 1024L * 1024L * 1024L, 0);
write(fd, "hi", 2);
close(fd);
Это logging занимает один дисковый блок logger на диске, но 1 ГБ (и изменение) в logger (несжатой) резервной копии logging и 1 ГБ (и изменение) при logger восстановлении. Антисоциально, но logging возможно.
logging
Должны ли потоки файлов журнала открываться/закрываться при каждой записи или оставаться открытыми в течение всего срока службы настольного приложения?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.