В моем недавнем приложении мне пришлось написать серию cronjobs, и я использую их для регистрации в пользовательском файле журнала, эти файлы журнала содержат сведения об исключениях и/или показывают статус каждого выполнения.
Проблема в том, что мой файл журнала становится все больше, и я хотел бы очистить часть содержимого из файла и сделать его тонким. Например, сохранить в этом файле содержимое только за последние 10 дней и очистить старое содержимое.
Мой пример файла журнала ошибок приведен ниже:
[2019-05-16 06:38:16 AM]: Catalog Import - Process started.
[2019-05-16 06:38:17 AM]: - Brands processed.
[2019-05-16 06:38:18 AM]: - Categories processed.
[2019-05-16 06:38:27 AM]: - Catalogues processed.
[2019-05-16 06:38:29 AM]: - CSV generated.
[2019-05-16 06:38:29 AM]: Catalog Import - Process completed.
[2019-05-16 06:38:29 AM]: =======================================================================
[2019-05-17 06:38:16 AM]: Catalog Import - Process started.
[2019-05-17 06:38:17 AM]: Exception - (json encoded response usually array stuffs)
[2019-05-17 06:38:18 AM]: - Categories processed.
[2019-05-17 06:38:27 AM]: - Catalogues processed.
[2019-05-17 06:38:29 AM]: Error - (json encoded response usually array stuffs)
[2019-05-17 06:38:29 AM]: Catalog Import - Process completed.
[2019-05-17 06:38:29 AM]: =======================================================================
Что было бы лучшим способом периодически удалять содержимое в файле журнала?
Или, если вышеперечисленное вам не подходит, зациклите файл построчно, прочитайте дату и сделайте то, что нужно сделать, исходя из даты.
@RolandWeber: Нет, это не вариант, я не хочу хранить несколько файлов журнала .... Я просто хочу периодически очищать один файл журнала.
@Andreas: Мне нравится твоя идея, но я не особо разбираюсь в программировании... не могли бы вы помочь мне с примерами кода для этого.... чтобы упростить задачу, просто удалите первые n строк из этого файла журнала, если файл журнала размер достигает определенного предела, скажем, 5 МБ.
Это сложнее сделать, чем удалить строки со старой датой. Могу написать краткий ответ на ваш запрос в вопросе.
Откройте файл и зациклите файл.
Когда вы найдете дату, которая «слишком старая», удалите строку.
Затем сохраните новые данные в файле журнала.
$log_file = 'catalog_import.log';
// get the file contents as array.
$lines = file( $log_file);
if (!empty($lines)) {
foreach ($lines as $row => $line) {
// if older than 10 days.
if (time() - strtotime(substr($line, 1, 10)) > 60 * 60 * 24 * 10) {
unset($lines[$row]);
}
}
}
//write the filtered data to the file.
file_put_contents($log_file, implode("", $lines));
die('logs cleared successfully.');
Сначала сделайте это на копии, так как это непроверенный код.
... и убедитесь, что файл журнала не записывается во время его обработки таким образом.
@Andreas: ваш код помог с некоторыми незначительными изменениями .... я обновил его, пожалуйста, проверьте.
У меня все еще есть некоторые сомнения относительно его производительности ... что, если мой файл журнала слишком велик, скажем, 1 ГБ, и мне нужно очистить некоторые данные в нем, а остальные сохранить, будет ли достаточно метода массива.
Попытайся. Я не знаю. Но если вы очищаете его ежедневно, он не должен расти таким большим. Верно?
@Andreas: да, это будет работать только для новых файлов журналов, в которых я реализую этот код очистки, но проблема в том, что у меня уже есть большие файлы журналов, с которыми мне нужно иметь дело. Я попробую несколько тестов по этому поводу и дам вам знать.
Я не думаю, что это займет более нескольких секунд времени обработки даже с файлом размером 1 ГБ. После того, как вы удалили лишнее один раз, файл будет меньше, и в следующий раз он будет быстрее.
Если вам нужно обрабатывать большие файлы, не стоит загружать их в память за один раз. Одновременно откройте входной файл и выходной файл с другим именем, затем прочитайте один пакет данных из входного файла и запишите все, что проходит фильтр, в выходной файл. И обязательно используйте буферизованный поток для вывода.
Ежедневно меняйте файлы журналов вместо того, чтобы пытаться редактировать их. Затем вы можете просто удалить старые файлы журнала.