Creating a Decorator for Logging

Python Decorators haqida o'rganamiz.

SU

Logging Uchun Dekorator Yaratish

Dekoratorlar keng turdagi maqsadlar uchun ishlatilishi mumkin, masalan, Django yoki Flask kabi veb-ramkalarda autentifikatsiya qo‘shishdan tortib, funktsiya chaqiruvi haqida foydali ma'lumotlarni loglashgacha.

Python kuchli va xavfsiz ishlaydigan logging moduliga ega bo‘lib, uni ishlatishingiz mumkin. Masalan, agar siz moliyaviy dastur yozgan bo‘lsangiz, tranzaksiyalarni kuzatish uchun qandaydir usulga ega bo‘lishni xohlaysiz. Garchi loglash bu turdagi narsalar uchun xavfsiz usul bo‘lmasa-da, siz ma'lumotlarni xavfsiz ma'lumotlar bazasiga yozadigan dekorator yaratishingiz mumkin.

Biroq, ishni biroz soddaroq qilish uchun, quyidagi misolda logni faylga yozishni ko‘rsatamiz.

Mana yangi fayl bo‘lib, unda logging_decorator.py nomli faylda yaratishingiz kerak bo‘lgan birinchi funktsiya:

# logging_decorator.py
 
import logging
 
def log(func):
    """
    Qaysi funktsiya chaqirilganini loglash
    """
    def wrapper(*args, **kwargs):
        name = func.__name__
        logger = logging.getLogger(name)
        logger.setLevel(logging.INFO)
 
        # log formatini va faylni qo‘shish
        logging_formatter(logger, name)
 
        logger.info(f"Funktsiya ishga tushmoqda: {name}")
        logger.info(f"{args=}, {kwargs=}")
        result = func(*args, **kwargs)
        logger.info("Natija: %s" % result)
        return result
    return wrapper

Eslatma

Bu kodning har bir qismiga chuqur tushunishingiz shart emas yoki logging_formatter() funktsiyasiga. Bu misol dekoratorlarning keng tarqalgan ishlatilish holati sifatida keltirilgan.

Ushbu dekorator ilgari keltirilgan dekoratorlar kabi ishlaydi: u funktsiyani qabul qiladi, uni qayta ishlash uchun wrapper funktsiyasini yaratadi (bu ham barcha pozitsion va kalit so‘z argumentlarini uzatishni o‘z ichiga oladi). Bu yerda farq shundaki, siz ekranga chop etish o‘rniga Pythonning logging modulini ishlatib, log faylga yozasiz. Buning uchun siz logging modulini import qilasiz, logging.getLogger() orqali logger yaratib, logging darajasini INFO darajasiga o‘rnatishingiz kerak.

Keyingi qadam — logging_formatter() funksiyasini chaqirib, logni qanday formatlashni va qayerga saqlashni belgilash. Nihoyat, siz loglashni amalga oshiradigan funktsiya haqida ma'lumotlarni logga yozasiz.

Endi logging_formatter() funksiyasini qo‘shamiz:

def logging_formatter(logger, name):
    """
    Loggerni formatlash va faylga yozish
    """
    fh = logging.FileHandler(f"{name}.log")
    fmt = '%(asctime)s- %(name)s- %(levelname)s- %(message)s'
    formatter = logging.Formatter(fmt)
    fh.setFormatter(formatter)
    logger.addHandler(fh)

Ushbu kod, dekoratsiya qilinayotgan funktsiyaning nomini olib, shu nomga asoslangan log faylini yaratadi. So‘ngra logda vaqtni, funktsiya nomini, log darajasini va log xabarini qo‘shish uchun format satrini yaratadi. Nihoyat, siz log formatini belgilab, loggerga faylni diskka yozishni amalga oshiradigan fayl qo‘shuvchini (file handler) qo‘shasiz.

Keyingi qadam — quyidagi kodni faylingizning oxiriga qo‘shish:

@log
def treble(a):
    return a * 3
 
if __name__ == '__main__':
    treble(5)

Bu treble() funksiyasini log() dekoratori bilan qanday dekoratsiya qilishni ko‘rsatadi.

Kod ishlatilganda, siz treble.log nomli faylni dasturingiz joylashgan papkada topasiz, va unda quyidagi kabi ma'lumotlar bo‘lishi kerak:

2020-05-04 16:15:19,980 - treble - INFO - Funktsiya ishga tushmoqda: treble
2020-05-04 16:15:19,980 - treble - INFO - args=(5,), kwargs={}
2020-05-04 16:15:19,980 - treble - INFO - Natija: 15

Bu log satrida vaqt tamg‘asi, funktsiya nomi, log darajasi va log funksiyasi tomonidan yaratilgan xabarlar ko‘rsatiladi.

Last updated on

On this page

Xato haqida xabar berish