Logging.info: примеры (PYTHON)
logging.info(msg: object, *args, **kwargs): NoneОписание функции logging.info
Функция logging.info() является частью стандартного модуля logging в Python и предназначена для регистрации информационных сообщений уровня INFO. Эта функция используется, когда нужно записать в лог обычное событие, подтверждающее, что программа работает в штатном режиме.
Аргументы функции:
- msg (обязательный): Строка сообщения, которое будет записано в лог. Может содержать спецификаторы формата для подстановки переменных.
- args (опциональный): Кортеж или словарь аргументов для форматирования строки
msg. Если используется словарь, в строкеmsgдолжны быть указаны ключи. - kwargs (опциональные): Дополнительные именованные аргументы, такие как
exc_info,stack_info,extra,stacklevel.exc_info: Если имеет значениеTrue, в лог добавляется информация об исключении (трассировка стека).stack_info: ЕслиTrue, добавляется информация о стеке вызовов.extra: Словарь с пользовательскими атрибутами для логгера.stacklevel: Уровень стека, с которого нужно начать запись.
Функция не возвращает значений. Её результат - запись сообщения в настроенные обработчики логов (handlers), если уровень логгирования текущего логгера равен INFO или ниже.
Простые примеры использования
Пример с базовым сообщением:
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Программа запущена')INFO:root:Программа запущена
Пример с форматированием строки:
import logging
logging.basicConfig(level=logging.INFO)
user = 'Алексей'
logging.info('Пользователь %s успешно авторизован', user)INFO:root:Пользователь Алексей успешно авторизован
Пример с использованием словаря для форматирования:
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Запрос от %(ip)s', {'ip': '192.168.1.1'})INFO:root:Запрос от 192.168.1.1
Другие функции модуля logging в Python
Модуль logging предоставляет функции для разных уровней серьезности событий.
- logging.debug(): Для отладочных сообщений. Уровень DEBUG. Используется для детальной диагностики.
- logging.warning(): Для предупреждений о потенциальных проблемах. Уровень WARNING.
- logging.error(): Для сообщений об ошибках, которые не привели к остановке программы. Уровень ERROR.
- logging.critical(): Для критических ошибок, после которых программа не может продолжаться. Уровень CRITICAL.
Выбор функции зависит от важности события. Для обычных информационных сообщений о ходе работы используется logging.info().
Аналоги в других языках программирования
Регистрация информационных событий - распространенная практика.
JavaScript (Node.js, библиотека winston):
const logger = require('winston');
logger.info('Сервер запущен на порту 3000');{"level":"info","message":"Сервер запущен на порту 3000","timestamp":"2023-10-01T12:00:00.000Z"}Java (библиотека log4j 2):
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger logger = LogManager.getLogger(MyApp.class);
logger.info("Пользователь {} подключен", username);12:00:00.001 INFO [main] MyApp - Пользователь Alex подключен
PHP (Monolog):
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('name');
$log->pushHandler(new StreamHandler('app.log', Logger::INFO));
$log->info('Запрос обработан', ['ip' => $_SERVER['REMOTE_ADDR']]);[2023-10-01T12:00:00.000000+03:00] name.INFO: Запрос обработан {"ip":"127.0.0.1"}Основное отличие - в синтаксисе и настройке контекстных данных, но концепция уровней логгирования общая.
Типичные ошибки
Сообщения не выводятся из-за уровня логгирования по умолчанию.
import logging
# Уровень по умолчанию - WARNING
logging.info('Это сообщение не будет видно')(Вывода нет)
Исправление - настройка базового уровня:
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Теперь сообщение видно')INFO:root:Теперь сообщение видно
Ошибка форматирования при несоответствии числа аргументов:
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Значения: %s и %s', 10) # Не хватает одного аргумента# В лог запишется строка "Значения: %s и %s" и аргумент 10, но возможна ошибка в более старых версиях.
Изменения в последних версиях Python
В версии Python 3.8 в функцию был добавлен параметр stacklevel. Этот параметр позволяет указать, с какого уровня стека вызовов нужно начинать поиск информации для записи в лог. Это полезно при создании оберток или вспомогательных функций для логгирования, чтобы в логах указывался исходный вызов, а не вызов функции-обертки.
import logging
def my_helper():
logging.info('Сообщение', stacklevel=2) # Указывает, что источник вызова на уровень выше
my_helper()Расширенные примеры использования
Логгирование с контекстной информацией с помощью параметра extra:
import logging
logging.basicConfig(format='%(asctime)s - %(user_id)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('Попытка входа в систему', extra={'user_id': 42})2023-10-01 12:00:00,000 - 42 - INFO - Попытка входа в систему
Запись информации об исключении:
import logging
logging.basicConfig(level=logging.INFO)
try:
1 / 0
except ZeroDivisionError:
logging.info('Произошло деление на ноль', exc_info=True)INFO:root:Произошло деление на ноль Traceback (most recent call last): File "", line 2, in ZeroDivisionError: division by zero
Использование словаря для аргументов с именованными заполнителями:
import logging
logging.basicConfig(level=logging.INFO)
log_data = {'user': 'Мария', 'action': 'logout'}
logging.info('Событие: пользователь=%(user)s, действие=%(action)s', log_data)INFO:root:Событие: пользователь=Мария, действие=logout
Настройка отдельного логгера с файловым обработчиком:
import logging
logger = logging.getLogger('app_logger')
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('app.log')
formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info('Запись в специальный файл лога')# В файле app.log появится строка: # app_logger - INFO - Запись в специальный файл лога