Php удалить только частичное содержимое из файла журнала

В моем недавнем приложении мне пришлось написать серию 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]: =======================================================================

Что было бы лучшим способом периодически удалять содержимое в файле журнала?

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

Roland Weber 27.05.2019 11:02

Или, если вышеперечисленное вам не подходит, зациклите файл построчно, прочитайте дату и сделайте то, что нужно сделать, исходя из даты.

Andreas 27.05.2019 11:30

@RolandWeber: Нет, это не вариант, я не хочу хранить несколько файлов журнала .... Я просто хочу периодически очищать один файл журнала.

Scrappy Cocco 28.05.2019 09:19

@Andreas: Мне нравится твоя идея, но я не особо разбираюсь в программировании... не могли бы вы помочь мне с примерами кода для этого.... чтобы упростить задачу, просто удалите первые n строк из этого файла журнала, если файл журнала размер достигает определенного предела, скажем, 5 МБ.

Scrappy Cocco 28.05.2019 09:22

Это сложнее сделать, чем удалить строки со старой датой. Могу написать краткий ответ на ваш запрос в вопросе.

Andreas 28.05.2019 09:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Откройте файл и зациклите файл.
Когда вы найдете дату, которая «слишком старая», удалите строку.

Затем сохраните новые данные в файле журнала.

$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.');

Сначала сделайте это на копии, так как это непроверенный код.

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

Roland Weber 28.05.2019 13:20

@Andreas: ваш код помог с некоторыми незначительными изменениями .... я обновил его, пожалуйста, проверьте.

Scrappy Cocco 28.05.2019 14:21

У меня все еще есть некоторые сомнения относительно его производительности ... что, если мой файл журнала слишком велик, скажем, 1 ГБ, и мне нужно очистить некоторые данные в нем, а остальные сохранить, будет ли достаточно метода массива.

Scrappy Cocco 28.05.2019 14:24

Попытайся. Я не знаю. Но если вы очищаете его ежедневно, он не должен расти таким большим. Верно?

Andreas 28.05.2019 14:25

@Andreas: да, это будет работать только для новых файлов журналов, в которых я реализую этот код очистки, но проблема в том, что у меня уже есть большие файлы журналов, с которыми мне нужно иметь дело. Я попробую несколько тестов по этому поводу и дам вам знать.

Scrappy Cocco 28.05.2019 14:37

Я не думаю, что это займет более нескольких секунд времени обработки даже с файлом размером 1 ГБ. После того, как вы удалили лишнее один раз, файл будет меньше, и в следующий раз он будет быстрее.

Andreas 28.05.2019 14:39

Если вам нужно обрабатывать большие файлы, не стоит загружать их в память за один раз. Одновременно откройте входной файл и выходной файл с другим именем, затем прочитайте один пакет данных из входного файла и запишите все, что проходит фильтр, в выходной файл. И обязательно используйте буферизованный поток для вывода.

Roland Weber 28.05.2019 14:47

Другие вопросы по теме

Похожие вопросы