Импорт логов Laravel в базу данных SQLite
В данной статье мы рассмотрим, как можно импортировать логи из файла логов Laravel в базу данных SQLite с помощью PHP. Приведенный ниже код выполняет следующие шаги: проверяет наличие аргумента командной строки, считывает файл логов, разбирает каждую строку и вставляет данные в базу данных.
Исходный код с комментариями
<?php
// Проверяем, передан ли путь к файлу логов в качестве аргумента командной строки
if ($argc !== 2) {
echo "Usage: php log_importer.php path/to/laravel.log\n";
exit(1); // Завершаем выполнение скрипта с кодом ошибки
}
// Получаем путь к файлу логов из аргумента командной строки
$logFile = $argv[1];
// Определяем путь к файлу базы данных SQLite
$dbFile = './logs.sqlite';
// Создаем (или открываем) базу данных SQLite
$db = new PDO('sqlite:' . $dbFile);
// Создаем таблицу логов, если она не существует
$db->exec("CREATE TABLE IF NOT EXISTS logs (
id INTEGER PRIMARY KEY,
date TEXT,
environment TEXT,
level TEXT,
message TEXT
)");
// Функция для разбора строки лога
function parseLogLine($line): ?array
{
// Определяем шаблон для разбора строки лога
$pattern = '/^\[(.*?)\] (.*?)\.(\w+): (.*)$/';
// Если строка соответствует шаблону, разбираем ее
if (preg_match($pattern, $line, $matches)) {
return [
'date' => $matches[1], // Дата и время
'environment' => $matches[2], // Окружение (environment)
'level' => $matches[3], // Уровень лога (например, error, info)
'message' => $matches[4] // Сообщение лога
];
}
return null; // Возвращаем null, если строка не соответствует шаблону
}
// Проверяем, существует ли файл логов
if (file_exists($logFile)) {
// Открываем файл логов для чтения
$file = fopen($logFile, 'r');
// Читаем файл построчно
while ($line = fgets($file)) {
// Разбираем строку лога
$logEntry = parseLogLine($line);
// Если строка успешно разобрана, вставляем данные в базу данных
if ($logEntry) {
$stmt = $db->prepare("INSERT INTO logs (date, environment, level, message) VALUES (:date, :environment, :level, :message)");
$stmt->bindParam(':date', $logEntry['date']);
$stmt->bindParam(':environment', $logEntry['environment']);
$stmt->bindParam(':level', $logEntry['level']);
$stmt->bindParam(':message', $logEntry['message']);
$stmt->execute(); // Выполняем вставку данных
}
}
// Закрываем файл после чтения
fclose($file);
echo "Файл логов был успешно импортирован в базу.\n";
} else {
// Выводим сообщение об ошибке, если файл логов не существует
echo "Лог файл не существует.\n";
exit(1); // Завершаем выполнение скрипта с кодом ошибки
}
?>
Описание работы скрипта
-
Проверка аргументов командной строки: Скрипт проверяет, был ли передан путь к файлу логов в качестве аргумента командной строки. Если аргумент не передан, выводится сообщение с инструкцией по использованию, и скрипт завершает работу.
-
Подключение к базе данных SQLite: Скрипт определяет путь к файлу базы данных SQLite и подключается к ней. Если база данных не существует, она будет создана автоматически.
-
Создание таблицы логов: Если таблица logs не существует, она создается с полями id, date, environment, level и message.
-
Функция для разбора строк логов: Функция parseLogLine использует регулярное выражение для разбора строк логов. Если строка соответствует шаблону, возвращается массив с данными; если нет, возвращается null.
-
Чтение файла логов: Скрипт проверяет, существует ли файл логов. Если файл существует, он открывается для чтения построчно.
-
Вставка данных в базу данных: Каждая строка файла логов разбирается и, если успешно, вставляется в таблицу logs базы данных SQLite.
-
Завершение работы: После успешной обработки всех строк файла логов, скрипт выводит сообщение об успешном импорте данных в базу данных SQLite. Если файл логов не существует, выводится сообщение об ошибке.
Этот скрипт является простым и эффективным способом импорта логов Laravel в базу данных SQLite для дальнейшего анализа и обработки данных.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.