Глава 23 · Часть IV · Реализуем SafeSort
Добавляем журнал работы программы
Итог для пользователя печатается напрямую; диагностика идёт отдельным каналом — через модуль logging.
SafeSort · Часть 4 из 6Реализация
Add configuration and logging
Area: CLIPriority: Low
В коде SafeSort уже несколько раз встречался вызов logger.warning
(...). Это не то же самое, что вывод на экран через print()
: у программы есть два разных канала сообщений с разным назначением.
| Пользовательский вывод (print) | Журнал (logging) | |
|---|---|---|
| Кому адресован | Человеку, который вызвал команду | Тому, кто разбирается, что произошло внутри |
| Что показывает | Итог команды — сколько файлов, сколько перемещений | Диагностику: пропущенные файлы, ошибки доступа |
| Формат | Короткий, фиксированный | Уровень важности + подробности |
src/safesort/cli.py
def _configure_logging() -> None:
logging.basicConfig(
level=logging.WARNING,
format="%(levelname)s:%(name)s:%(message)s",
)
SafeSort использует три уровня важности, каждый для своей ситуации:
| Уровень | Когда используется в SafeSort |
|---|---|
| INFO | Обычные события: файл перемещён, символическая ссылка пропущена |
| WARNING | Что-то пропущено, но программа продолжает работать: каталог недоступен |
| ERROR | Операция не удалась: перемещение или восстановление не выполнено |
Модуль получает logger по своему имени
Строка
logger = logging.getLogger(__name__) сохраняет имя модуля в поле LogRecord.name. Само по себе это ещё не выводит имя в терминал: его показывает подстановка %(name)s в formatter. Без него имя осталось бы в записи журнала, но пользователь его не увидел бы.Коротко
- Пользовательский вывод (print) и диагностический журнал (logging) — два разных канала с разным назначением, их не стоит смешивать.
- Три уровня важности — INFO, WARNING, ERROR — покрывают всё, что нужно SafeSort, без избыточной настройки.
- getLogger(__name__) записывает имя logger; formatter с %(name)s делает его видимым.