Логування - це збереження Інформації про всі процеси резервного копіювання, аварійного завершення застосунку, тощо… Всі події повинні автоматично зберігається в лог, так що Ви завжди можете бути в курсі поточного стану програми. Кожного разу, коли нам потрібно створити програму, з’являється необхідність, інтеграції системи логування. Причини для її імплементації різноманітні:
- налагодження;
- статистика;
- потенційні попередження;
- загальні помилки.
- …
Більшість фреймворків і пакетів відповідають стандарту PSR-3, який описує, як працює система логування. По суті, це інтерфейс, на який ви повинні покладатися, передаючи журнали в систему. Серед них Monolog є найбільш використовуваним, оскільки він дуже гнучкий і легкий для розуміння. Повертаючись до суті, реалізація PSR-3 описує вісім рівнів журналу. У порядку «серйозності»: надзвичайна ситуація, оповіщення, критична помилка, помилка, попередження, сповіщення, інформація та налагодження. (Emergency, Alert, Critical, Error, Warning, Notice, Informational, Debug)
Вашим завданням буде розробити свою систему логування.
- Ознайомитися з теоретичними знаннями.
- Ознайомитися зі стандартом PSR-3.
- Ознайомитися з можливостями логування у системі Laravel.
-
Написати міграцію на створення таблиці ‘logs’ в базі даних. У таблиці мають бути присутні наступні поля:
‘level’. У цій колонці можуть бути лише наступні значення:
['info', 'warning', 'error', 'debug', 'critical', 'alert', 'emergency', 'notice']
.‘driver'. За замовчуванням значення повинне бути database.
‘message’. Обов’язкове поле.
‘trace’. Обов’язкове поле.
‘channel’. Може приймати значення null, якщо дані відсутні.
‘created_at’, ‘updated_at’. Для реалізації використовувати
$table->timestamps();
. -
Виконати міграцію за допомогою команди php artisan migrate.
-
Повинна бути можливість відкотити (Rollback) міграцію.
-
Створити Модель ‘Log’ у директорії ‘Назва_вашого_проекту/app/Models/
-
Написати seeder для заповнення таблиці випадковими (random) даними.
- Реалізувати Інтерфейс LogRepositoryInterface та зареєструвати в сервіс контейнері Laravel.
- Реалізувати клас
GetAllLogsAction
та повернутиGetAllLogsResponse
зі всіма логами. - Реалізувати клас
GetLogsByLevelAction
та повернутиGetLogsByLevelResponse
. На вході масив з назвами рівнів логів. Необхідно повернути логи тільки відповідних рівнів. - Реалізувати клас
GetLogsStatisticAction
та повернутиGetLogsStatisticResponse
. Необхідно отримати дані у зі структурою 'назва рівня' і 'кількість логів цього рівняю' Наприклад:
[ 'info' => 5, 'warning' => 3, 'error' => 3, 'debug' => 21, 'critical' => 1, 'alert' => 0, 'emergency' => 0, 'notice' => 0, ]
- Реалізувати маршрут
api/logs
в файліroutes/api.php
по якому можна отримати всі логи у форматі json - Реалізувати маршрут
api/logs/{level}
в файліroutes/api.php
по якому можна отримати всі логи певного рівня у форматі json - Реалізувати маршрут
api/logs/statistic
в файліroutes/web.php
по якому можна отримати статистику по всіх рівнях і відрендирити їх у viewlogs.blade.php
Вам потрібно буде реалізувати те саме, що і у завданні 3, але використовувати логування Laravel з коробки. Вам потрібно буде штучно заповнити журнал логування, який знаходиться за шляхом “Назва_вашого_проекту/storage/logs/laravel.log”. Наступним кроком буде реалізація LogStorageService. Вам потрібно буде розпарсити файл логів і повернути результати у такому ж виді, як і у завданні 3.
- Реалізувати маршрут
api/storage/logs
в файліroutes/api.php
по якому можна отримати всі логи у форматі json - Реалізувати маршрут
api/storage/logs/{level}
в файліroutes/api.php
по якому можна отримати всі логи певного рівня у форматі json - Реалізувати маршрут
api/storage/logs/statistic
в файліroutes/web.php
по якому можна отримати статистику по всіх рівнях і відрендирити їх у viewlogs_storage.blade.php
Своє рішення можна перевірити запустивши тести PHPUnit.
./vendor/bin/phpunit
cp .env.example .env
cp .env.testing.example .env.testing
docker-compose up -d
docker-compose exec app php artisan migrate
docker-compose exec app php artisan db:seed
docker-compose exec app ./vendor/bin/phpunit
-
Завдання виконані коректно (7 балів)
-
Валідація даних виконана коректно (використовуються кастомні винятки, додаток не ламається при невалдіних вхідних значеннях) (1 бал)
-
Код написаний чисто, коментарів у коді немає і код відповідає стандарту PSR-12 (1 бал)
-
Awesomness - залишається на розсуд перевіряючого (1 бал)
Ваше рішення необхідно розмістити в окремій репозиторії на Bitbucket і надіслати посилання на нього.
Задавайте питання у коментарях до завдання у разі виникнення проблем.
Форкати цей репозиторій заборонено!