ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Четверг, 13 февраля, 2025
Сегодня у нас 1 праздник:
В 1910 года в Лондоне родился Уильям Брэдфорд Шокли (1910–1989), американский физик, один из изобретателей транзистора (полупроводникового триода).

Как ведется журналирование (логи) в программировании

Вы когда-нибудь запускали программу и она вылетала с ошибкой? Никаких сообщений об ошибках, никаких подсказок, только тишина. Как понять, что пошло не так? В этом случае на помощь приходит ведение журнала.

Журналы отслеживают, что происходит внутри вашего кода, чтобы вам не приходилось гадать, когда что-то идёт не так. Они похожи на print или console.log, но более мощные.

В этой статье мы используем Python, чтобы создать и продемонстрировать вам несколько примеров кода для ведения журнала.

Прежде чем мы поговорим о журналах, давайте разберёмся в различных типах ошибок, с которыми вы можете столкнуться.

 

Типы ошибок

При создании приложения для производственной среды необходимо отображать ошибки в зависимости от их серьёзности. Существует несколько типов ошибок, и наиболее важные из них:

 

Что такое ведение журнала?

Теперь давайте перейдём к сути и разберёмся, что такое лесозаготовка.

Проще говоря, логирование — это процесс записи информации обо всём, что делает ваша программа. Записываемая информация может быть любой: от базовых сведений, таких как вызов функций, до более подробных, таких как отслеживание ошибок или проблем с производительностью.

 

Зачем нам нужно ведение журнала?

Вы можете подумать: «Если логи выводят ошибки, информацию и так далее, я могу просто использовать операторы вывода. Зачем мне нужны логи?» Что ж, print работает, но логи дают вам больше возможностей:

 

Это то, что print не может сделать эффективно.

 

Как добавить журналы в Python

В Python модуль logging создан специально для ведения журнала.

Давайте настроим несколько журналов, чтобы посмотреть, как они работают.

 

Шаг 1: Импортируйте модуль ведения журнала

Чтобы начать использовать ведение журнала, нам нужно импортировать модуль:

import logging

 

Шаг 2: Регистрируйте сообщения

Теперь вы можете начать регистрировать сообщения в своей программе. Вы можете использовать разные уровни регистрации в зависимости от важности сообщения. Напомним, что эти уровни (от наименее до наиболее важных):

 

Давайте запишем простое сообщение на каждом уровне:

logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message")

 

При запуске вы увидите сообщение, выводимое на консоль, похожее на это:

Как ведутся логи в программировании

 

Вы можете задаться вопросом, почему вы не видите сообщения DEBUG и INFO. Этому препятствует уровень ведения журнала по умолчанию.

По умолчанию уровень ведения журнала установлен на WARNING. Это означает, что будут отображаться только сообщения с уровнем важности WARNING или выше (то есть WARNINGERROR, и CRITICAL).

 

Шаг 3: Настройте базовую конфигурацию

Чтобы увидеть сообщения debug и info, нам нужно установить уровень ведения журнала DEBUG перед запуском кода.

Это означает, что нам нужно настроить логи. Для этого воспользуйтесь описанным ниже методом basicConfig:

logging.basicConfig(level=logging.DEBUG)

 

Эта базовая конфигурация позволяет регистрировать сообщения на уровне DEBUG или выше. Вы можете изменить уровень в зависимости от типа необходимых вам журналов.

Теперь все журналы печатаются:

Как ведутся логи в программировании

 

Шаг 4: Войдите в файл

Теперь давайте сохраним эти журналы в файл, чтобы отслеживать ошибки и время их возникновения. Для этого обновите конфигурацию:

logging.basicConfig(filename='data_log.log', level=logging.DEBUG, 
                    format='%(asctime)s - %(levelname)s - %(message)s')

 

Здесь:

 

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

Как ведутся логи в программировании

 

Как использовать регистраторы для большего контроля

Если вы работаете над крупным проектом, вам может понадобиться служебный логгер, который можно использовать в любом месте кода. Давайте создадим такой пользовательский логгер.

Сначала мы обновим basicConfig так, чтобы он добавлял имя файла, номер строки и записывал всё, даже специальные символы:

logging.basicConfig(
        filename=log_file,
        level=logging.DEBUG,
        format='%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s', 
        filemode='w',
        encoding='utf-8' 
    )

 

Объяснение:

 

Теперь давайте настроим пользовательский консольный регистратор:

  console_handler = logging.StreamHandler()
  console_handler.setLevel(logging.DEBUG)
  console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')  # Added line number
  console_handler.setFormatter(console_formatter)

  logging.getLogger().addHandler(console_handler)

 

Эта настройка выполняет следующее:

 

Полный пример кода

import logging
import os
from datetime import datetime

def setup_daily_logger():
    base_dir = os.path.dirname(os.path.abspath(__file__))
    log_dir = os.path.join(base_dir, 'logs')  
    os.makedirs(log_dir, exist_ok=True)


    current_time = datetime.now().strftime("%m_%d_%y_%I_%M_%p")
    log_file = os.path.join(log_dir, f"{current_time}.log")


    logging.basicConfig(
        filename=log_file,
        level=logging.DEBUG,
        format='%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s', 
        filemode='w',
        encoding='utf-8' 
    )


    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')  # Added line number
    console_handler.setFormatter(console_formatter)


    logging.getLogger().addHandler(console_handler)


    return logging.getLogger(__name__)

Что же теперь будет?

Теперь при каждом запуске программы в папке logs будет создаваться новый файл журнала. При каждом запуске программы будет создаваться новый файл журнала с уникальной отметкой времени.

Вот так:

Как ведутся логи в программировании

 

Эти журналы дадут вам чёткое представление о поведении вашей программы и помогут в отладке.

Надеюсь, эта статья помогла вам лучше понять логи и их важность в программировании.

 

Практические примеры из реального мира

Теперь, когда вы понимаете, что такое логи и как их настроить в Python, давайте рассмотрим примеры из реальной жизни.

 

1. Бот: Скрапинг крупнейшего сайта недвижимости Кореи

Вот пример бота, созданного для сбора данных с крупнейшего в Корее сайта о недвижимости.

Как ведутся логи в программировании

Как ведутся логи в программировании

Один из методов в классе этого бота использует логирование, чтобы отслеживать, правильно ли бот выбирает провинцию.

Как ведутся логи в программировании

Здесь:

 

2. Бот: Очистка групп Facebook

Теперь давайте посмотрим, как ведение журнала помогает в парсинге групп Facebook.

Отслеживание ошибок

Как ведутся логи в программировании

 

Здесь вы видите точное имя файла и номер строки, в которой возникает ошибка.

Как ведутся логи в программировании

 

Как только мы выявили и устранили проблему, бот снова начал работать.

Он фиксирует каждую деталь в журнале, экономя часы отладки за счёт определения места возникновения ошибок.

Упрощенная отладка

 

Заключение

Ведение журналов — это одна из тех вещей, о которых никто не задумывается, пока что-нибудь не сломается. Но когда это происходит, журналы становятся вашим лучшим другом.

Запомните:

 

Не забудьте добавить ведение журнала в свой код. Вы потом будете себя благодарить!

Exit mobile version