### Задача 5. Система логирования (ООП, Наследование, Работа с файлами) **Постановка** * **Logger (базовый класс):** Умеет логировать сообщения. * **FileLogger:** Наследник, который пишет в файл. * **ConsoleLogger:** Наследник, который пишет в консоль. * **MultiLogger:** Комбинированный логгер, который пишет везде. **Задание** **Класс `Logger`:** 1. Создайте класс `Logger`. 2. Метод `__init__(self, name)` — сохраняет имя логгера. 3. Метод `format_message(self, level, message)` — возвращает строку формата: `"[2026-07-18 10:30:45] [INFO] [LoggerName] Message"`. Используйте `datetime.now()`. 4. Метод `log(self, level, message)` — абстрактный метод, просто пишет `pass`. Переопределяется в наследниках. **Класс `FileLogger(Logger)`:** 1. Создайте класс `FileLogger`, наследующий `Logger`. 2. В `__init__(self, name, filename)` вызовите `super().__init__(name)` и сохраните имя файла. 3. Переопределите `log(self, level, message)` — форматирует через `format_message` и записывает в файл (режим `'a'`, append). **Класс `ConsoleLogger(Logger)`:** 1. Создайте класс `ConsoleLogger`, наследующий `Logger`. 2. Переопределите `log(self, level, message)` — форматирует и выводит в консоль через `print`. **Класс `MultiLogger`:** 1. Создайте класс `MultiLogger`. 2. В `__init__(self, *loggers)` сохраните список логгеров. 3. Метод `log(self, level, message)` — вызывает `log` у каждого логгера. **Тесты:** 1. Создайте `FileLogger("file_log", "app.log")` 2. Создайте `ConsoleLogger("console_log")` 3. Создайте `MultiLogger(file_logger, console_logger)` 4. Залогируйте несколько сообщений разных уровней: `"INFO"`, `"WARNING"`, `"ERROR"` 5. Проверьте, что сообщения появились и в файле, и в консоли