Справочник API
В этом разделе находится документация, автоматически сгенерированная из исходного кода chutils.
Пакет chutils
chutils
Пакет chutils - набор переиспользуемых утилит для Python.
Основная цель - упростить рутинные задачи, такие как работа с конфигурацией, логированием и управлением секретами, с минимальными усилиями со стороны разработчика.
Ключевые особенности:
- Автоматическое обнаружение корня проекта и файла конфигурации.
- Поддержка форматов config.yml, config.yaml и config.ini (YAML в приоритете).
- Удобные функции для доступа к настройкам, включая разрешение путей.
- Асинхронные версии основных функций для неблокирующей работы.
- Готовый к работе логгер с выводом в консоль и ротируемые файлы.
- Безопасное хранение секретов через системное хранилище (keyring).
Основное использование:
Вам не нужно ничего инициализировать. Просто импортируйте и используйте:
from chutils import get_config_value, setup_logger, SecretManager
logger = setup_logger()
secrets = SecretManager("my_app")
db_host = get_config_value("Database", "host", "localhost")
logger.info(f"Подключение к базе данных на {db_host}")
Ручная инициализация (для нестандартных случаев):
Если автоматика не сработала, вы можете указать путь к корню проекта вручную:
import chutils
chutils.init(base_dir="/path/to/your/project")
ChutilsLogger
Bases: Logger
Кастомный класс логгера, расширяющий стандартный logging.Logger.
Добавляет поддержку пользовательских уровней логирования (devdebug и mediumdebug),
обеспечивая при этом корректную работу статических анализаторов и автодополнения в IDE.
Иерархия уровней
DEVDEBUG(9): Максимально подробный вывод для глубокой отладки. Предназначен для вывода дампов переменных, внутренних состояний и т.д.DEBUG(10): Стандартный отладочный уровень.MEDIUMDEBUG(15): Промежуточный уровень между DEBUG и INFO. Полезен для менее критичной, но более подробной, чем INFO, информации.INFO(20): Стандартный информационный уровень.
Note
Не создавайте экземпляр напрямую. Используйте setup_logger().
Example
logger: ChutilsLogger = setup_logger()
logger.devdebug("Максимально подробное сообщение")
devdebug(message, *args, **kws)
Логирует сообщение с уровнем DEVDEBUG (9).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
message
|
str
|
Сообщение для логирования. |
required |
*args
|
Any
|
Аргументы форматирования. |
()
|
**kws
|
Any
|
Ключевые слова для логгера. |
{}
|
mediumdebug(message, *args, **kws)
Логирует сообщение с уровнем MEDIUMDEBUG (15).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
message
|
str
|
Сообщение для логирования. |
required |
*args
|
Any
|
Аргументы форматирования. |
()
|
**kws
|
Any
|
Ключевые слова для логгера. |
{}
|
SafeTimedRotatingFileHandler
Bases: TimedRotatingFileHandler
Надежный обработчик ротации логов, адаптированный для Windows.
Этот класс решает проблему PermissionError при ротации логов в Windows,
гарантируя, что файл будет закрыт перед переименованием.
Он явно закрывает файловый поток перед вызовом стандартной логики ротации.
doRollover()
Выполняет ротацию, закрывая текущий поток перед операцией.
SecretManager
Универсальный менеджер для безопасного хранения и получения секретов.
Приоритет получения секрета:
1. Системное хранилище (keyring).
2. Переменные из .env файла в корне проекта.
3. Переменные окружения ОС.
Attributes:
| Name | Type | Description |
|---|---|---|
service_name |
str
|
Полное имя сервиса для keyring. |
disable_keyring |
bool
|
Флаг отключения работы с keyring. |
__init__(service_name=None, prefix=None)
Инициализирует менеджер и лениво загружает переменные из .env файла.
Порядок определения service_name:
1. Значение, переданное в конструктор (если оно не пустое).
2. Значение из конфигурационного файла (секция Secrets, ключ service_name).
3. Абсолютный путь к корню проекта (для гарантированной уникальности).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
service_name
|
Optional[str]
|
Опциональное уникальное имя для вашего приложения. |
None
|
prefix
|
Optional[str]
|
Опциональный префикс для |
None
|
Raises:
| Type | Description |
|---|---|
ValueError
|
Если не удалось определить service_name. |
adelete_secret(key)
async
Асинхронная версия delete_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет был удален или уже не существовал. |
bool
|
False, если произошла ошибка при удалении. |
aget_secret(key)
async
Асинхронная версия get_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
Optional[str]
|
Значение секрета или None. |
asave_secret(key, value)
async
Асинхронная версия save_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
value
|
str
|
Секретное значение. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет успешно сохранен в keyring. |
bool
|
False, если произошла ошибка. |
delete_secret(key)
Удаляет пару ключ-значение из системного хранилища (keyring). Эта функция не влияет на переменные окружения или .env файлы.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True если секрет удален или отсутствовал, |
bool
|
False при ошибке. |
get_secret(key)
Получает секретное значение по ключу.
Поиск происходит в следующем порядке:
1. Системное хранилище (keyring).
2. Переменные из .env файла / переменные окружения.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
Optional[str]
|
Значение секрета или None, если ключ не найден. |
save_secret(key, value)
Сохраняет пару ключ-значение в системном хранилище (keyring). Эта функция не влияет на переменные окружения или .env файлы.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
value
|
str
|
Секретное значение. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет успешно сохранен в keyring. |
bool
|
False, если произошла ошибка. |
update_secret(key, value)
Обновляет значение для существующего ключа в системном хранилище (keyring).
Это псевдоним для save_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
value
|
str
|
Новое значение. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет успешно обновлен в keyring. |
bool
|
False в случае ошибки. |
aget_config()
async
Асинхронная версия get_config.
Returns:
| Type | Description |
|---|---|
Dict
|
Словарь конфигурации. |
asave_config_value(section, key, value, cfg_file=None, save_to_local=False)
async
Асинхронно сохраняет одно значение в конфигурационном файле.
Работает как асинхронная обертка вокруг синхронной save_config_value().
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа в секции. |
required |
value
|
Any
|
Новое значение для ключа. |
required |
cfg_file
|
Optional[str]
|
Опциональный путь к файлу для сохранения. Если указан,
имеет приоритет над |
None
|
save_to_local
|
bool
|
Если True, и существует локальный файл конфигурации
(например, |
False
|
Returns:
| Name | Type | Description |
|---|---|---|
True |
bool
|
Если значение было успешно обновлено и сохранено. |
False |
bool
|
Если файл не найден, или произошла ошибка. |
get_config()
Загружает и объединяет конфигурацию из всех доступных источников.
Результат кэшируется. Повторные вызовы возвращают кэшированный объект, если он не был сброшен (например, при сохранении нового значения).
Returns:
| Name | Type | Description |
|---|---|---|
_config_object |
Dict
|
Словарь со всей конфигурацией проекта. Если файлы не найдены, возвращается пустой словарь. |
get_config_boolean(section, key, fallback=False, config=None)
Получает булево значение из конфигурации.
Распознает 'true', '1', 't', 'y', 'yes' как True и 'false', '0', 'f', 'n', 'no' как False (без учета регистра).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
bool
|
Значение по умолчанию, если ключ не найден или не может быть распознан как булево. |
False
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
bool
|
True или False. |
get_config_float(section, key, fallback=0.0, config=None)
Получает дробное значение из конфигурации.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
float
|
Значение по умолчанию, если ключ не найден или не может быть преобразован в float. |
0.0
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
float
|
Float или fallback. |
get_config_int(section, key, fallback=0, config=None)
Получает целочисленное значение из конфигурации.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
int
|
Значение по умолчанию, если ключ не найден или не может быть преобразован в int. |
0
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
int
|
Целое число из конфигурации или |
get_config_list(section, key, fallback=None, config=None)
Получает значение как список из конфигурации.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
Optional[List[Any]]
|
Значение по умолчанию, если ключ не найден. |
None
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
List[Any]
|
Список из конфигурации или |
List[Any]
|
возвращается пустой список. |
get_config_path(section, key, fallback=None, config=None, resolve_from_root=True)
Получает путь из конфигурации.
Функция автоматически добавляет _BASE_DIR к относительным путям,
если resolve_from_root установлено в True.
Args:
section: Имя секции.
key: Имя ключа.
fallback: Значение по умолчанию, если ключ не найден.
config: Опциональный, предварительно загруженный словарь конфигурации.
resolve_from_root: Если True, относительные пути будут разрешаться
относительно _BASE_DIR. Если False, пути возвращаются как есть,
без добавления _BASE_DIR.
Returns:
Путь из конфигурации или fallback.
get_config_section(section_name, fallback=None, config=None)
Получает всю секцию конфигурации как словарь.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section_name
|
str
|
Имя секции. |
required |
fallback
|
Optional[Dict]
|
Значение по умолчанию, если секция не найдена. |
None
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
Dict[str, Any]
|
Словарь с содержимым секции или |
Dict[str, Any]
|
возвращается пустой словарь. |
get_config_value(section, key, fallback=None, config=None)
Получает произвольное значение из конфигурации.
Если значение не найдено или оно пустое, возвращает fallback.
Для ключа disable_keyring в секции secrets проверяет переменную окружения.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
Any
|
Значение по умолчанию, если ключ не найден или его значение пустое. |
None
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
Any
|
Значение из конфигурации или |
init(base_dir)
Ручная инициализация пакета с указанием базовой директории проекта.
Эту функцию нужно вызывать только в том случае, если автоматическое определение корня проекта не сработало. Вызывать следует один раз в самом начале работы основного скрипта вашего приложения.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
base_dir
|
str
|
Абсолютный путь к корневой директории проекта. |
required |
Raises:
| Type | Description |
|---|---|
ValueError
|
Если указанная директория не существует. |
log_function_details(func)
Декоратор для логирования деталей вызова функции.
Записывает аргументы, время выполнения и возвращаемое значение на уровне DEVDEBUG.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
func
|
Декорируемая функция. |
required |
Returns:
| Type | Description |
|---|---|
|
Обертка функции с логированием. |
Example
@log_function_details
def add(a, b):
return a + b
add(2, 3)
setup_logger(name='app_logger', config_section_name=None, log_level=None, log_file_name=None, force_reconfigure=False, rotation_type=None, max_bytes=None, compress=None, backup_count=None, encoding=None, when=None, interval=None, utc=None, at_time=None, **kwargs)
Настраивает и возвращает экземпляр логгера.
Приоритет настроек:
0. Переменные окружения CH_LOG_NO_TIME и CH_LOG_NO_FILE имеют наивысший приоритет.
1. Явные аргументы, переданные в эту функцию.
2. Объединенные настройки из Logging.loggers.{name} (если есть) поверх Logging.default (если есть).
3. Для обратной совместимости: если Logging.default и Logging.loggers отсутствуют,
используются прямые настройки из Logging (как в старом формате).
4. Значения по умолчанию, зашитые в коде.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Имя логгера. |
'app_logger'
|
config_section_name
|
Optional[str]
|
Имя секции в конфиге (например, 'MyAuditLogger').
Если указана, настройки из этой секции переопределяют настройки из общей секции |
None
|
log_level
|
Optional[LogLevel]
|
Уровень логирования (строка или LogLevel). |
None
|
log_file_name
|
Optional[str]
|
Имя файла для логирования. Если не указано, имя берется из конфигурации ('Logging', 'log_file_name'). |
None
|
force_reconfigure
|
bool
|
Удалить существующие обработчики и настроить заново. |
False
|
rotation_type
|
Optional[str]
|
Тип ротации ('time' или 'size'). |
None
|
max_bytes
|
Optional[int]
|
Макс. размер файла для ротации по 'size'. |
None
|
compress
|
Optional[bool]
|
Сжимать ли ротированные логи в |
None
|
backup_count
|
Optional[int]
|
Количество хранимых ротированных файлов. |
None
|
encoding
|
Optional[str]
|
Кодировка файла (по умолчанию 'utf-8'). |
None
|
when
|
Optional[str]
|
Для 'time'. Тип интервала ('S', 'M', 'H', 'D', 'midnight', 'W0'-'W6'). |
None
|
interval
|
Optional[int]
|
Для 'time'. Длина интервала. |
None
|
utc
|
Optional[bool]
|
Для 'time'. Использовать UTC время. |
None
|
at_time
|
Optional[time]
|
Для 'time'. Время ротации (при when='midnight'). |
None
|
**kwargs
|
Any
|
Дополнительные параметры для FileHandler (например, |
{}
|
Returns:
| Type | Description |
|---|---|
ChutilsLogger
|
Настроенный экземпляр ChutilsLogger. |
options: members: [init]
Модуль config
chutils.config
Модуль для работы с конфигурацией.
Обеспечивает автоматический поиск файла config.yml, config.yaml или config.ini
в корне проекта и предоставляет удобные функции для чтения и сохранения настроек.
Поддерживает кастомные уровни логирования при условии, что модуль logger загружен.
aget_config()
async
Асинхронная версия get_config.
Returns:
| Type | Description |
|---|---|
Dict
|
Словарь конфигурации. |
asave_config_value(section, key, value, cfg_file=None, save_to_local=False)
async
Асинхронно сохраняет одно значение в конфигурационном файле.
Работает как асинхронная обертка вокруг синхронной save_config_value().
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа в секции. |
required |
value
|
Any
|
Новое значение для ключа. |
required |
cfg_file
|
Optional[str]
|
Опциональный путь к файлу для сохранения. Если указан,
имеет приоритет над |
None
|
save_to_local
|
bool
|
Если True, и существует локальный файл конфигурации
(например, |
False
|
Returns:
| Name | Type | Description |
|---|---|---|
True |
bool
|
Если значение было успешно обновлено и сохранено. |
False |
bool
|
Если файл не найден, или произошла ошибка. |
find_project_root(start_path, markers)
Ищет корень проекта, двигаясь вверх по дереву каталогов.
Корень определяется по наличию одного из файлов-маркеров (например, .git или pyproject.toml).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
start_path
|
Path
|
Директория, с которой начинается поиск. |
required |
markers
|
List[str]
|
Список имен файлов или папок (маркеров), наличие которых в директории указывает на то, что это корень проекта. |
required |
Returns:
| Type | Description |
|---|---|
Optional[Path]
|
Объект Path, представляющий корневую директорию проекта, или None, если корень не найден. |
get_config()
Загружает и объединяет конфигурацию из всех доступных источников.
Результат кэшируется. Повторные вызовы возвращают кэшированный объект, если он не был сброшен (например, при сохранении нового значения).
Returns:
| Name | Type | Description |
|---|---|---|
_config_object |
Dict
|
Словарь со всей конфигурацией проекта. Если файлы не найдены, возвращается пустой словарь. |
get_config_boolean(section, key, fallback=False, config=None)
Получает булево значение из конфигурации.
Распознает 'true', '1', 't', 'y', 'yes' как True и 'false', '0', 'f', 'n', 'no' как False (без учета регистра).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
bool
|
Значение по умолчанию, если ключ не найден или не может быть распознан как булево. |
False
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
bool
|
True или False. |
get_config_float(section, key, fallback=0.0, config=None)
Получает дробное значение из конфигурации.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
float
|
Значение по умолчанию, если ключ не найден или не может быть преобразован в float. |
0.0
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
float
|
Float или fallback. |
get_config_int(section, key, fallback=0, config=None)
Получает целочисленное значение из конфигурации.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
int
|
Значение по умолчанию, если ключ не найден или не может быть преобразован в int. |
0
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
int
|
Целое число из конфигурации или |
get_config_list(section, key, fallback=None, config=None)
Получает значение как список из конфигурации.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
Optional[List[Any]]
|
Значение по умолчанию, если ключ не найден. |
None
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
List[Any]
|
Список из конфигурации или |
List[Any]
|
возвращается пустой список. |
get_config_path(section, key, fallback=None, config=None, resolve_from_root=True)
Получает путь из конфигурации.
Функция автоматически добавляет _BASE_DIR к относительным путям,
если resolve_from_root установлено в True.
Args:
section: Имя секции.
key: Имя ключа.
fallback: Значение по умолчанию, если ключ не найден.
config: Опциональный, предварительно загруженный словарь конфигурации.
resolve_from_root: Если True, относительные пути будут разрешаться
относительно _BASE_DIR. Если False, пути возвращаются как есть,
без добавления _BASE_DIR.
Returns:
Путь из конфигурации или fallback.
get_config_section(section_name, fallback=None, config=None)
Получает всю секцию конфигурации как словарь.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section_name
|
str
|
Имя секции. |
required |
fallback
|
Optional[Dict]
|
Значение по умолчанию, если секция не найдена. |
None
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
Dict[str, Any]
|
Словарь с содержимым секции или |
Dict[str, Any]
|
возвращается пустой словарь. |
get_config_value(section, key, fallback=None, config=None)
Получает произвольное значение из конфигурации.
Если значение не найдено или оно пустое, возвращает fallback.
Для ключа disable_keyring в секции secrets проверяет переменную окружения.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа. |
required |
fallback
|
Any
|
Значение по умолчанию, если ключ не найден или его значение пустое. |
None
|
config
|
Optional[Dict]
|
Опциональный, предварительно загруженный словарь конфигурации. |
None
|
Returns:
| Type | Description |
|---|---|
Any
|
Значение из конфигурации или |
save_config_value(section, key, value, cfg_file=None, save_to_local=False)
Сохраняет или обновляет одно значение в файле конфигурации.
Warning
Важно: При сохранении в .yml комментарии и форматирование будут утеряны.
При сохранении в .ini - сохраняются.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
section
|
str
|
Имя секции. |
required |
key
|
str
|
Имя ключа в секции. |
required |
value
|
Any
|
Новое значение для ключа. |
required |
cfg_file
|
Optional[str]
|
Опциональный путь к файлу для сохранения. Если указан,
имеет приоритет над |
None
|
save_to_local
|
bool
|
Если True, и существует локальный файл конфигурации
(например, |
False
|
Returns:
| Name | Type | Description |
|---|---|---|
True |
bool
|
Если значение было успешно обновлено и сохранено. |
False |
bool
|
Если файл не найден, или произошла ошибка. |
options: members:
- get_config
- get_config_value
- get_config_int
- get_config_float
- get_config_boolean
- get_config_list
- get_config_section
- save_config_value
Переопределение конфигурации локальным файлом
Функция get_config() теперь автоматически ищет и загружает локальный файл конфигурации (например, config.local.yml
или config.local.ini) в той же директории, что и основной файл (config.yml или config.ini). Значения из локального
файла переопределяют соответствующие значения из основного файла.
Это позволяет удобно управлять чувствительными или специфичными для разработчика настройками, не коммитя их в репозиторий.
Пример:
Если config.yml содержит:
# config.yml
Database:
host: production_db.com
port: 5432
App:
debug: false
А config.local.yml содержит:
# config.local.yml
Database:
host: localhost
App:
debug: true
developer_mode: true
Тогда get_config() вернет объединенную конфигурацию, где локальные настройки переопределяют основные:
{
"Database": {
"host": "localhost", # Переопределено локальным файлом
"port": 5432 # Взято из основного файла
},
"App": {
"debug": True, # Переопределено локальным файлом
"developer_mode": True # Добавлено из локального файла
}
}
Важно: Убедитесь, что вы добавили config.local.yml (или config.local.ini) в ваш .gitignore, чтобы случайно
не закоммитить локальные или чувствительные настройки.
Модуль logger
chutils.logger
Модуль для настройки логирования.
Предоставляет унифицированную функцию setup_logger для создания и настройки логгеров, которые могут выводить сообщения в консоль и в файлы с автоматической ротацией. Директория для логов ('logs') создается автоматически в корне проекта.
ChutilsLogger
Bases: Logger
Кастомный класс логгера, расширяющий стандартный logging.Logger.
Добавляет поддержку пользовательских уровней логирования (devdebug и mediumdebug),
обеспечивая при этом корректную работу статических анализаторов и автодополнения в IDE.
Иерархия уровней
DEVDEBUG(9): Максимально подробный вывод для глубокой отладки. Предназначен для вывода дампов переменных, внутренних состояний и т.д.DEBUG(10): Стандартный отладочный уровень.MEDIUMDEBUG(15): Промежуточный уровень между DEBUG и INFO. Полезен для менее критичной, но более подробной, чем INFO, информации.INFO(20): Стандартный информационный уровень.
Note
Не создавайте экземпляр напрямую. Используйте setup_logger().
Example
logger: ChutilsLogger = setup_logger()
logger.devdebug("Максимально подробное сообщение")
devdebug(message, *args, **kws)
Логирует сообщение с уровнем DEVDEBUG (9).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
message
|
str
|
Сообщение для логирования. |
required |
*args
|
Any
|
Аргументы форматирования. |
()
|
**kws
|
Any
|
Ключевые слова для логгера. |
{}
|
mediumdebug(message, *args, **kws)
Логирует сообщение с уровнем MEDIUMDEBUG (15).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
message
|
str
|
Сообщение для логирования. |
required |
*args
|
Any
|
Аргументы форматирования. |
()
|
**kws
|
Any
|
Ключевые слова для логгера. |
{}
|
CompressingRotatingFileHandler
Bases: RotatingFileHandler
Обработчик ротации по размеру с поддержкой сжатия (gzip).
Обеспечивает корректную работу с цепочкой сжатых бэкапов.
doRollover()
Выполняет ротацию логов с последующим сжатием старого файла.
Процесс:
1. Закрытие текущего потока.
2. Сдвиг существующих архивов (log.1.gz -> log.2.gz).
3. Переименование текущего лога в log.1.
4. Открытие нового файла для дальнейшей записи.
5. Сжатие переименованного файла в фоне.
CompressingTimedRotatingFileHandler
Bases: SafeTimedRotatingFileHandler
Обработчик ротации по времени с поддержкой сжатия (gzip).
doRollover()
Выполняет временную ротацию и сжимает полученные бэкапы.
LogLevel
Bases: str, Enum
Перечисление для поддерживаемых уровней логирования.
SafeTimedRotatingFileHandler
Bases: TimedRotatingFileHandler
Надежный обработчик ротации логов, адаптированный для Windows.
Этот класс решает проблему PermissionError при ротации логов в Windows,
гарантируя, что файл будет закрыт перед переименованием.
Он явно закрывает файловый поток перед вызовом стандартной логики ротации.
doRollover()
Выполняет ротацию, закрывая текущий поток перед операцией.
setup_logger(name='app_logger', config_section_name=None, log_level=None, log_file_name=None, force_reconfigure=False, rotation_type=None, max_bytes=None, compress=None, backup_count=None, encoding=None, when=None, interval=None, utc=None, at_time=None, **kwargs)
Настраивает и возвращает экземпляр логгера.
Приоритет настроек:
0. Переменные окружения CH_LOG_NO_TIME и CH_LOG_NO_FILE имеют наивысший приоритет.
1. Явные аргументы, переданные в эту функцию.
2. Объединенные настройки из Logging.loggers.{name} (если есть) поверх Logging.default (если есть).
3. Для обратной совместимости: если Logging.default и Logging.loggers отсутствуют,
используются прямые настройки из Logging (как в старом формате).
4. Значения по умолчанию, зашитые в коде.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Имя логгера. |
'app_logger'
|
config_section_name
|
Optional[str]
|
Имя секции в конфиге (например, 'MyAuditLogger').
Если указана, настройки из этой секции переопределяют настройки из общей секции |
None
|
log_level
|
Optional[LogLevel]
|
Уровень логирования (строка или LogLevel). |
None
|
log_file_name
|
Optional[str]
|
Имя файла для логирования. Если не указано, имя берется из конфигурации ('Logging', 'log_file_name'). |
None
|
force_reconfigure
|
bool
|
Удалить существующие обработчики и настроить заново. |
False
|
rotation_type
|
Optional[str]
|
Тип ротации ('time' или 'size'). |
None
|
max_bytes
|
Optional[int]
|
Макс. размер файла для ротации по 'size'. |
None
|
compress
|
Optional[bool]
|
Сжимать ли ротированные логи в |
None
|
backup_count
|
Optional[int]
|
Количество хранимых ротированных файлов. |
None
|
encoding
|
Optional[str]
|
Кодировка файла (по умолчанию 'utf-8'). |
None
|
when
|
Optional[str]
|
Для 'time'. Тип интервала ('S', 'M', 'H', 'D', 'midnight', 'W0'-'W6'). |
None
|
interval
|
Optional[int]
|
Для 'time'. Длина интервала. |
None
|
utc
|
Optional[bool]
|
Для 'time'. Использовать UTC время. |
None
|
at_time
|
Optional[time]
|
Для 'time'. Время ротации (при when='midnight'). |
None
|
**kwargs
|
Any
|
Дополнительные параметры для FileHandler (например, |
{}
|
Returns:
| Type | Description |
|---|---|
ChutilsLogger
|
Настроенный экземпляр ChutilsLogger. |
options: members:
- setup_logger
- ChutilsLogger
- DEVDEBUG_LEVEL_NUM
- MEDIUMDEBUG_LEVEL_NUM
Расширенная настройка логгера: управление уровнем, ротацией и сжатием
Функция setup_logger предлагает гибкую настройку логгеров, включая управление уровнем логирования, ротацией файлов и
их сжатием.
Ключевые особенности и изменения:
- Динамическое обновление уровня логирования: При каждом вызове
setup_loggerдля существующего логгера его уровень логирования всегда обновляется до указанного или настроенного значения. - Гибкий
log_level: Параметрlog_levelтеперь может принимать как объектыLogLevel(например,LogLevel.INFO), так и их строковое представление (например,"INFO","DEBUG"). Это позволяет удобно задавать уровень как через код, так и через конфигурационные файлы. - Идемпотентная настройка обработчиков: Обработчики логов (для консоли и файлов) настраиваются только при первом
вызове для данного логгера. При последующих вызовах обработчики не пересоздаются, если только не указан флаг
force_reconfigure=True. Это предотвращает дублирование обработчиков и обеспечивает эффективную работу. - Расширенные опции ротации и сжатия: Поддерживаются различные типы ротации (по времени или по размеру), а также
автоматическое сжатие ротированных файлов в
.gzдля экономии места. Эти параметры могут быть заданы как напрямую в вызовеsetup_logger, так и через конфигурационный файлconfig.ymlв секцииLogging.
Параметры ротации:
rotation_type(строка): Определяет тип ротации.'time'(по умолчанию): Ротация происходит по времени (например, ежедневно).'size': Ротация происходит, когда файл лога достигает определенного размера.
max_bytes(целое число): Максимальный размер файла лога в байтах. Используется только еслиrotation_typeустановлен в'size'. При достижении этого размера файл будет ротирован. Значение0означает отсутствие лимита по размеру.compress(булево): ЕслиTrue, ротированные файлы логов будут автоматически сжиматься в формат.gz. Это помогает экономить место на диске.backup_count(целое число): Количество ротированных файлов логов, которые будут храниться. Старые файлы, превышающие это количество, будут удаляться.
Гибкая настройка логгеров через конфигурацию: параметр config_section_name
Теперь setup_logger позволяет гибко управлять настройками разных логгеров через конфигурационный файл, используя
параметр config_section_name.
Приоритет настроек:
- Аргументы функции: Значения, переданные напрямую в
setup_logger(например,log_level=...), имеют наивысший приоритет. - Секция, указанная в
config_section_name: Если вsetup_loggerпередан параметрconfig_section_name="MyLogger", то настройки будут искаться в секции[MyLogger](например,[AuditLogger]или[EventLogger]). - Общая секция
[Logging]: Если настройка не найдена в специфичной секции (или та не указана), поиск происходит в общей секции[Logging]. Она служит для задания настроек по умолчанию для всех логгеров. - Встроенные значения: Если настройка не найдена нигде, используется жестко заданное в коде значение
(например,
rotation_type='time').
Пример конфигурации (config.yml):
# config.yml
# Общая секция, задает настройки по умолчанию для всех логгеров
Logging:
log_level: INFO
rotation_type: time
compress: true
log_backup_count: 5
# Специфичная секция для логгера аудита
AuditLogger:
log_level: DEBUG # Переопределяет log_level из [Logging]
log_file_name: "audit.log" # Задает уникальное имя файла
log_backup_count: 30 # Переопределяет log_backup_count из [Logging]
# Специфичная секция для логгера событий
EventLogger:
log_file_name: "events.log"
rotation_type: size # Переопределяет тип ротации
max_bytes: 10485760 # 10 МБ
Примеры использования в коде:
from chutils import setup_logger
# 1. Логгер с настройками по умолчанию из секции [Logging]
# Так как config_section_name не указан, используется только [Logging].
main_logger = setup_logger("main_app")
main_logger.info("Это сообщение от основного логгера.") # Уровень INFO
# 2. Логгер аудита со специфичными настройками
# Явно указываем, что нужно прочитать секцию [AuditLogger]
audit_logger = setup_logger("audit", config_section_name="AuditLogger")
audit_logger.debug("Это отладочное сообщение для аудита.") # Уровень DEBUG
# 3. Логгер событий со своими настройками
event_logger = setup_logger("events", config_section_name="EventLogger")
event_logger.info("Логгер событий использует ротацию по размеру.") # Уровень INFO из [Logging]
# 4. Явное переопределение аргументом функции (высший приоритет)
# Уровень будет WARNING, несмотря на настройки в config.yml
important_logger = setup_logger("important", log_level="WARNING")
Примеры использования:
1. Ротация по размеру со сжатием:
Чтобы настроить логгер, который ротирует файлы при достижении 1 МБ и сжимает старые бэкапы, используйте:
from chutils import setup_logger
logger = setup_logger(
"my_app_size_rotated",
log_file_name="app_size.log",
rotation_type='size',
max_bytes=1048576, # 1 МБ
compress=True,
backup_count=5
)
logger.info("Это сообщение будет записано в файл app_size.log, который будет ротироваться по размеру и сжиматься.")
2. Ежедневная ротация со сжатием (по умолчанию):
Для ежедневной ротации со сжатием (это поведение по умолчанию, если rotation_type не указан или равен 'time'):
from chutils import setup_logger
logger = setup_logger(
"my_app_time_rotated",
log_file_name="app_time.log",
rotation_type='time', # Можно опустить, так как это значение по умолчанию
compress=True,
backup_count=7
)
logger.info("Это сообщение будет записано в файл app_time.log, который будет ротироваться ежедневно и сжиматься.")
3. Настройка через config.yml:
Вы также можете управлять этими параметрами через ваш config.yml:
# config.yml
Logging:
log_level: INFO
log_file_name: app.log
rotation_type: size # Или 'time'
max_bytes: 5242880 # 5 МБ, если rotation_type: size
compress: true # Сжимать ротированные файлы
log_backup_count: 10 # Хранить 10 бэкапов
При такой конфигурации вызов setup_logger() без явных параметров автоматически применит эти настройки:
from chutils import setup_logger
logger = setup_logger("my_app")
logger.info("Настройки ротации и сжатия взяты из config.yml.")
Пример создания нескольких логгеров
Вы можете создавать разные логгеры для разных частей вашего приложения, передавая уникальное имя в setup_logger.
Параметр log_file_name позволяет указать отдельный файл для каждого логгера, что помогает фильтровать и разделять
логи.
# main.py
from chutils import setup_logger
# Основной логгер приложения будет писать в main_app.log
main_logger = setup_logger("main_app", log_file_name="main_app.log")
# Логгер для модуля, отвечающего за работу с базой данных, будет писать в database.log
db_logger = setup_logger("database", log_file_name="database.log")
main_logger.info("Приложение запущено.")
db_logger.debug("Инициализация подключения к БД...")
В лог-файлах вы увидите сообщения от соответствующих логгеров.
Более подробный пример можно найти в файле ../examples/05_different_log_levels.py.
Модуль secret_manager
chutils.secret_manager
Модуль для безопасного управления секретами.
Обеспечивает доступ к секретам через системное хранилище (keyring), файлы .env и переменные окружения ОС с настраиваемыми приоритетами.
SecretManager
Универсальный менеджер для безопасного хранения и получения секретов.
Приоритет получения секрета:
1. Системное хранилище (keyring).
2. Переменные из .env файла в корне проекта.
3. Переменные окружения ОС.
Attributes:
| Name | Type | Description |
|---|---|---|
service_name |
str
|
Полное имя сервиса для keyring. |
disable_keyring |
bool
|
Флаг отключения работы с keyring. |
__init__(service_name=None, prefix=None)
Инициализирует менеджер и лениво загружает переменные из .env файла.
Порядок определения service_name:
1. Значение, переданное в конструктор (если оно не пустое).
2. Значение из конфигурационного файла (секция Secrets, ключ service_name).
3. Абсолютный путь к корню проекта (для гарантированной уникальности).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
service_name
|
Optional[str]
|
Опциональное уникальное имя для вашего приложения. |
None
|
prefix
|
Optional[str]
|
Опциональный префикс для |
None
|
Raises:
| Type | Description |
|---|---|
ValueError
|
Если не удалось определить service_name. |
adelete_secret(key)
async
Асинхронная версия delete_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет был удален или уже не существовал. |
bool
|
False, если произошла ошибка при удалении. |
aget_secret(key)
async
Асинхронная версия get_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
Optional[str]
|
Значение секрета или None. |
asave_secret(key, value)
async
Асинхронная версия save_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
value
|
str
|
Секретное значение. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет успешно сохранен в keyring. |
bool
|
False, если произошла ошибка. |
delete_secret(key)
Удаляет пару ключ-значение из системного хранилища (keyring). Эта функция не влияет на переменные окружения или .env файлы.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True если секрет удален или отсутствовал, |
bool
|
False при ошибке. |
get_secret(key)
Получает секретное значение по ключу.
Поиск происходит в следующем порядке:
1. Системное хранилище (keyring).
2. Переменные из .env файла / переменные окружения.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
Returns:
| Type | Description |
|---|---|
Optional[str]
|
Значение секрета или None, если ключ не найден. |
save_secret(key, value)
Сохраняет пару ключ-значение в системном хранилище (keyring). Эта функция не влияет на переменные окружения или .env файлы.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
value
|
str
|
Секретное значение. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет успешно сохранен в keyring. |
bool
|
False, если произошла ошибка. |
update_secret(key, value)
Обновляет значение для существующего ключа в системном хранилище (keyring).
Это псевдоним для save_secret.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Ключ секрета. |
required |
value
|
str
|
Новое значение. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True, если секрет успешно обновлен в keyring. |
bool
|
False в случае ошибки. |
Конфигурация SecretManager и предотвращение конфликтов
Для безопасной работы с keyring крайне важно, чтобы каждое приложение использовало уникальное имя сервиса (
service_name). Это предотвращает конфликты, когда два разных приложения могут случайно перезаписать секреты друг
друга.
SecretManager определяет service_name по следующему приоритету:
-
Значение, переданное в конструктор:
python from chutils import SecretManager # Явное указание имени сервиса (наивысший приоритет) secrets = SecretManager("my-super-unique-app-name") -
Значение из конфигурационного файла: Если
service_nameне передан в конструктор (или передан пустым),SecretManagerпопытается найти его в вашемconfig.ymlфайле в секцииSecrets.yaml # config.yml Secrets: service_name: my-super-unique-app-name prefix: "WebApp_" # Опционально, можно переопределить префиксВ этом случаеSecretManagerможно инициализировать без аргументов:python from chutils import SecretManager # Имя будет взято из config.yml secrets = SecretManager() -
Абсолютный путь к проекту (поведение по умолчанию): Если имя не найдено ни в конструкторе, ни в конфигурации,
SecretManagerавтоматически использует абсолютный путь к корню вашего проекта в качествеservice_name.Это гарантирует, что
service_nameбудет уникальным для каждого проекта, предотвращая конфликты по умолчанию без необходимости ручной настройки.
Префикс
Итоговое имя сервиса в keyring формируется как prefix + service_name. Префикс также можно настроить. Порядок
приоритета для префикса:
- Значение, переданное в конструктор.
- Значение из
config.yml(секцияSecrets, ключprefix). - Значение по умолчанию:
"Chutils_".