📜Raporlama

Python ile raporlama (logging) işlemleri ve logging modülünün kullanımı

🏂 Raporlamaya Giriş

  • 📦 Raporlama işlemleri için logging modülü kullanır

  • 🍱 Python içerisinde hazır olarak bulunan bir modüldür, indirmeye gerek yok

  • 📜 logging modülü print yapısından daha kullanışlıdır

  • 👨‍💼 Raporlama seviyeleri ile isteğe bağlı çıktılar verilir

  • 🙄 print metodu olsaydı if koşulları ile yapmamız gerekirdi

🏗️ Oluşturma İşlemleri

  • 🔨 Yapılandırma ayarları logging.basicConfig metodu ile düzenlenir

  • 💎 format ile çıktıların yapısı, level ile çıktıların sınırı belirlenir

  • 🚀 logging.getLogger metodu __name__ ile kullanıldığında, dosya ismine ait bir raporlayıcı oluşturur

  • 👨‍💼 Oluşturulan yeni raporlayıcılar setLogger metodu ile sınırlandırılabilir

  • 💁‍♂️ Bu sınırlandırmalar diğer raporlayıcıları etkilemez

import logging

log_format = (
        '%(asctime)s - '
        '%(name)s - '
        '%(funcName)s - '
        '%(levelname)s - '
        '%(message)s'
)
log_level = logging.DEBUG

# Tüm raporlayıcıları tanımlama
logging.basicConfig(format=log_format , level=log_level)

logger = logging.getLogger(__name__)

# Belirli bir raporlayıcı sınırlama
logger.setLevel(logging.ERROR) 

📢 logging modülü globaldir, her dosya için ortak log yapısı kullanılır

🎌 Temel Kullanım

Raporlayıcı objenizin debug, info, warn, error, exception, fatal metotları ile raporlama yapabilirsiniz

  • 👮‍♂️ Her metot karşılığı olan raporlama seviyesine göre raporlama yapar

👮‍♂️ Raporlama Seviyeleri

Raporlama seviyeli yukarıdan aşağıya doğru daha da sınırlı hale gelir.

  • DEBUG işlemi ERROR çıktılarını da raporlar

  • ERROR çıktıları kendinden daha düşük çıktıları raporlarmaz

📂 Dosyaya Raporlama

import logging

message = "Raporlanacak"
LOG_DIR = "dosya/dizini"
LOG_FILE = "dosya.log"
FLAG = "w" # a+, r
ENCODING = "utf-8"

# Rapolamayı tanımlama
logging.basicConfig(
    handlers=[logging.FileHandler(LOG_DIR + LOG_FILE, FLAG, ENCODING)], 
    level=logging.DEBUG,
    format='%(asctime)s: %(message)s'
)

logging.info("mesaj") # Raporu yazma

👨‍🎨 Detaylı Renkli Raporlama

  • 🧐 Detaylarla ilgilenenler için colorlog modülü önerilir

  • 🖌 Metinleri %(log_color) ve %(reset)s değişkenleri arasına alarak renklendirebilirsin

  • 🙄 İşlemin çalışması için colorlog.ColorFormatter objesini logger objesine alttaki gibi eklemen lazım

import logging
LOG_LEVEL = logging.DEBUG
LOGFORMAT = (
    " %(log_color)s%(levelname)-8s%(reset)s |"
    " %(log_color)s%(message)s%(reset)s")
from colorlog import ColoredFormatter
logging.root.setLevel(LOG_LEVEL)
formatter = ColoredFormatter(LOGFORMAT)
stream = logging.StreamHandler()
stream.setLevel(LOG_LEVEL)
stream.setFormatter(formatter)
log = logging.getLogger('pythonConfig')
log.setLevel(LOG_LEVEL)
log.addHandler(stream)

log.debug("A quirky message only developers care about")
log.info("Curious users might want to know this")
log.warn("Something is wrong and any user should be informed")
log.error("Serious stuff, this is red for a reason")
log.critical("OH NO everything is on fire")

‍🧙‍♂ Detaylı bilgi için How can I color Python logging output? alanına bakabilirsin.

🎨 Renkli Raporlama

  • 📦 Renkli raporlama için coloredlogs modülü kullanılır

  • ⏬ Yüklemek için pip install coloredlogs komutunu kullanın

  • 💡 Renklendirme için standart konsol renk komutlarını kullanır

  • 👨‍🔧 Renklendirme çalışmazsacolorama modülünü yükleyin

  • ⏬ Yüklemek için pip install colorama komutunu kullanın

💁‍♂️ Alternatif olarak, en kolay kullanımı sağlayan zenglog modülüne bakmanda fayda var

import coloredlogs
import logging

# Logger objesi oluşturma
logger = logging.getLogger(__name__)

# Tüm raporlama işlemlerinin renkli olmasını sağlar
coloredlogs.install(level='DEBUG')

# Sadece verilen logger'ın renkli olmasını sağlar
coloredlogs.install(level='DEBUG', logger=logger)

# Formatı değiştirme
log_format = ""
    + "%(asctime)s,%(msecs)03d %(hostname)s %(name)s[%(process)d] "
    + "%(levelname)s %(message)s"
coloredlogs.install(level='DEBUG', fmt=log_format)

# Örnekler
logger.debug("this is a debugging message")
logger.info("this is an informational message")
logger.warning("this is a warning message")
logger.error("this is an error message")
logger.critical("this is a critical message")

‍🧙‍♂ Detaylı bilgi için coloredlogs alanına bakabilirsin.

🔨 Yapılandırma Dosyası

{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": {
        "simple": {
            "class": "colorlog.ColoredFormatter",
            "format": "%(asctime)s %(log_color)s%(message)s%(reset)s",
            "datefmt": "%H:%M:%S"
        },
        "detailed": {
            "class": "logging.Formatter",
            "format": "%(asctime)s.%(msecs)03d [%(threadName)s] %(levelname)-7s %(message)s",
            "datefmt": "%Y-%m-%d %H:%M:%S"
        }
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "level": "INFO",
            "formatter": "simple",
            "stream": "ext://sys.stdout"
        },
        "debug_file_handler": {
            "class": "logging.handlers.RotatingFileHandler",
            "level": "DEBUG",
            "formatter": "detailed",
            "filename": "log/debug/{filename}.log",
            "maxBytes": 10485760,
            "backupCount": 20,
            "mode": "w",
            "encoding": "utf8"
        },
        "info_file_handler": {
            "class": "logging.handlers.RotatingFileHandler",
            "level": "INFO",
            "formatter": "detailed",
            "filename": "log/info/{filename}.log",
            "maxBytes": 10485760,
            "backupCount": 20,
            "mode": "w",
            "encoding": "utf8"
        },
        "warn_file_handler": {
            "class": "logging.handlers.RotatingFileHandler",
            "level": "WARNING",
            "formatter": "detailed",
            "filename": "log/warning/{filename}.log",
            "maxBytes": 10485760,
            "backupCount": 20,
            "mode": "w",
            "encoding": "utf8"
        },
        "error_file_handler": {
            "class": "logging.handlers.RotatingFileHandler",
            "level": "ERROR",
            "formatter": "detailed",
            "filename": "log/error/{filename}.log",
            "maxBytes": 10485760,
            "backupCount": 20,
            "mode": "w",
            "encoding": "utf8"
        }
    },
    "loggers": {
        "urllib3.connectionpool": {
            "level": "ERROR",
            "handlers": [
                "console"
            ],
            "propagate": false
        }
    },
    "root": {
        "level": "DEBUG",
        "handlers": [
            "console",
            "debug_file_handler",
            "info_file_handler",
            "warn_file_handler",
            "error_file_handler"
        ]
    }
}

🔗 Faydalı Bağlantılar

🚀 Bu alandaki bağlantılar YEmoji ~Bağlantılar yapısına uygundur

Last updated

© 2024 ~ Yunus Emre Ak ~ yEmreAk