Почему у меня не работают разные уровни логирования в Python logging?

Как настроить скрипт так, чтобы сообщения журналирования уровня INFO отправлялись только в файл, а сообщения уровня WARNING и выше отправлялись и в Телеграмм, и в файл?
  • 20 августа 2024 г. 8:34
Ответы на вопрос 2
Если у вас не работают разные уровни логирования, возможно, проблема заключается в неправильной настройке логгера или обработчиков. 

Чтобы отправлять сообщения уровня INFO только в файл, а сообщения уровня WARNING и выше и в Телеграмм, и в файл, можно создать два отдельных обработчика - один для записи в файл, другой для отправки сообщений в Телеграмм. 

Пример кода:

```python
import logging
from logging.handlers import RotatingFileHandler
from logging.handlers import TelegramHandler

# Настройка логгера
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # уровень логирования по умолчанию

# Создание обработчика для файла
file_handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=1)
file_handler.setLevel(logging.INFO)  # уровень логирования для файла
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# Добавление обработчика в логгер
logger.addHandler(file_handler)

# Создание обработчика для Telegram
telegram_handler = TelegramHandler('<token>', '<chat_id>')
telegram_handler.setLevel(logging.WARNING)  # уровень логирования для Telegram

# Добавление обработчика в логгер
logger.addHandler(telegram_handler)

# Примеры сообщений
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
```

Помимо этого кода, вам также потребуется настроить обработчик для отправки сообщений в Телеграмм. Для этого можете воспользоваться сторонней библиотекой, например, `python-telegram-handler`.

Следует также убедиться, что у вас правильно установлены все необходимые библиотеки и зависимости.
Ты задал уровень WARNING для самого логгера (не для хэндлеров), поэтому он INFO отбрасывает сходу. До хэндлеров ничего не доходит просто. 
Я бы использовал эту либу немного по-другому (пример с её гитхаба)
t_handler = tg_logger.TgLoggerHandler(users=[...], token=TELEGRAM_TOKEN)
t_handler.setLevel(logging.WARNING)
logger.addHandler(t_handler)

Так куда более похоже на обычные лог-хэндлеры, проще управлять и читать даже если с либой мало знаком.
Ну или если очень хочется setup(), то так:
t_handler = tg_logger.setup(logger, token=token, users=users, tg_format="<b><u>%(name)s</u> : %(levelname)s</b>\n\n<code>%(message)s</code>")
t_handler.setLevel(logging.WARNING)


Так что логгеру задай уровень подетальнее, INFO или даже DEBUG, а тонкую настройку делай на уровне хэндлеров.
Похожие вопросы