Глава 23 · Часть IV · Реализуем SafeSort

Добавляем журнал работы программы

Итог для пользователя печатается напрямую; диагностика идёт отдельным каналом — через модуль logging.

SafeSort · Часть 4 из 6Реализация
GitHubIssue #11 · Project «SafeSort — первый релиз»
Add configuration and logging
Area: CLIPriority: Low

В коде SafeSort уже несколько раз встречался вызов logger.warning (...). Это не то же самое, что вывод на экран через print() : у программы есть два разных канала сообщений с разным назначением.

Программавыполняет командуВывод дляпользователяprint() — итогкоманды
Программавыполняет командуЖурнал (logging)диагностика: чтопропущено, что неудалось
Пользовательский вывод (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 делает его видимым.
Официальная документация
Logging HOWTO
LogRecord attributes