Logging در Django: راهنمای کامل لاگ‌گیری، ساختار، امنیت و پیکربندی

این مقاله سیستم Logging در Django را توضیح می‌دهد. موضوعاتی مانند Loggers، Handlers، Filters، Formatters، پیامدهای امنیتی، AdminEmailHandler و نحوهٔ پیکربندی LOGGING با dictConfig بررسی می‌شوند. همچنین نحوهٔ عملکرد لاگ‌گیری و نقش هر بخش در مدیریت خطا و نظارت بر سلامت سیستم توضیح داده شده است.

Logging Django، لاگ‌گیری جنگوLoggers، Handlers، Filters، FormattersAdminEmailHandler، LOGGING dictConfig

~6 دقیقه مطالعه · آخرین به‌روزرسانی ۲۴ اسفند ۱۴۰۴

مقدمه

بسیاری از برنامه‌نویسان پایتون برای دیباگ سریع از print() استفاده می‌کنند، اما سیستم logging بسیار قدرتمندتر، ساخت‌یافته‌تر و قابل‌کنترل‌تر است. Django سیستم logging پایتون را گسترش می‌دهد تا اطلاعات دقیق‌تری دربارهٔ وضعیت و سلامت برنامه ارائه دهد.


مروری بر Logging در Django

Django از ماژول داخلی logging پایتون استفاده می‌کند. یک پیکربندی logging از چهار بخش تشکیل می‌شود:

  • Loggers
  • Handlers
  • Filters
  • Formatters

Loggers

Logger نقطهٔ ورود به سیستم logging است. هر logger یک نام دارد و پیام‌ها را دریافت می‌کند.

سطوح لاگ (Log Levels)

  • DEBUG: اطلاعات سطح پایین برای دیباگ
  • INFO: اطلاعات عمومی سیستم
  • WARNING: هشدار دربارهٔ مشکل کوچک
  • ERROR: خطای مهم
  • CRITICAL: خطای بحرانی

هر پیام یک Log Record است و سطح خودش را دارد. اگر سطح پیام ≥ سطح logger باشد، پردازش می‌شود؛ در غیر این صورت نادیده گرفته می‌شود.

پس از تأیید سطح، پیام به Handler ارسال می‌شود.


Handlers

Handler تعیین می‌کند پیام کجا و چگونه ذخیره یا نمایش داده شود:

  • نوشتن در فایل
  • نمایش در کنسول
  • ارسال به شبکه
  • ارسال ایمیل

Handler نیز سطح لاگ دارد. اگر سطح پیام کمتر از سطح handler باشد، پیام نادیده گرفته می‌شود.

یک logger می‌تواند چند handler داشته باشد. مثلاً:

  • ERROR و CRITICAL → ارسال به سرویس هشدار
  • تمام پیام‌ها → ذخیره در فایل

Filters

Filter کنترل بیشتری روی پیام‌ها فراهم می‌کند. کاربردها:

  • فقط اجازهٔ عبور پیام‌های ERROR از یک ماژول خاص
  • تغییر سطح پیام‌ها (مثلاً تبدیل ERROR به WARNING)

Filter می‌تواند روی logger یا handler نصب شود و چندین filter می‌توانند زنجیره شوند.


Formatters

Formatter تعیین می‌کند پیام نهایی چگونه نمایش داده شود. معمولاً یک رشتهٔ قالب‌بندی پایتون است که شامل ویژگی‌های LogRecord می‌شود:

  • زمان
  • سطح پیام
  • نام logger
  • متن پیام

می‌توان Formatter سفارشی نیز نوشت.


پیامدهای امنیتی

لاگ‌ها ممکن است شامل اطلاعات حساس باشند:

  • درخواست‌های وب
  • Stack trace
  • مقادیر متغیرهای محلی
  • تنظیمات Django

بنابراین باید بدانید:

  • چه اطلاعاتی جمع‌آوری می‌شود
  • کجا ذخیره می‌شود
  • چه کسانی به آن دسترسی دارند

Django امکان فیلتر کردن اطلاعات حساس را فراهم می‌کند.


AdminEmailHandler

این handler هنگام وقوع خطاهای مهم، ایمیل‌هایی به مدیران سایت ارسال می‌کند. اگر include_html فعال باشد، ایمیل شامل:

  • traceback کامل
  • مقادیر متغیرهای محلی
  • تنظیمات Django

ارسال چنین اطلاعات حساسی از طریق ایمیل معمولاً توصیه نمی‌شود. بهتر است از سرویس‌های شخص ثالث مدیریت خطا استفاده کنید.


پیکربندی Logging

Django از فرمت dictConfig برای پیکربندی logging استفاده می‌کند. پیکربندی در تنظیمات LOGGING انجام می‌شود.

این تنظیمات شامل:

  • loggers
  • handlers
  • filters
  • formatters

اگر disable_existing_loggers=True باشد، تمام loggerهای پیش‌فرض غیرفعال می‌شوند. این معمولاً رفتار مطلوبی نیست.

Logging هنگام اجرای django.setup() پیکربندی می‌شود، بنابراین همیشه آمادهٔ استفاده است.


جمع‌بندی

سیستم logging در Django ابزاری قدرتمند برای نظارت، دیباگ و مدیریت خطاهاست. با شناخت Loggers، Handlers، Filters و Formatters می‌توانید ساختار لاگ‌گیری حرفه‌ای و امنی برای پروژهٔ خود ایجاد کنید. همچنین با پیکربندی صحیح LOGGING می‌توانید کنترل کاملی بر نحوهٔ ثبت و مدیریت پیام‌ها داشته باشید.

مقدمه

Django از سیستم logging پایتون و فرمت dictConfig برای پیکربندی لاگ‌ها استفاده می‌کند. در این مقاله چند نمونهٔ واقعی از پیکربندی لاگ‌گیری را بررسی می‌کنیم تا ببینید چگونه می‌توان رفتار لاگ‌گیری را مطابق نیازهای پروژه تنظیم کرد.


۱. پیکربندی ساده: نمایش لاگ‌ها در کنسول

این پیکربندی تمام پیام‌های سطح WARNING و بالاتر را در کنسول نمایش می‌دهد.


LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
        },
    },
    "root": {
        "handlers": ["console"],
        "level": "WARNING",
    },
}

با تغییر سطح به INFO یا DEBUG می‌توانید پیام‌های بیشتری ببینید.


۲. لاگ‌گیری دقیق‌تر: فقط پیام‌های Django

این پیکربندی پیام‌های logger با نام django را در کنسول نمایش می‌دهد.


LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
        },
    },
    "root": {
        "handlers": ["console"],
        "level": "WARNING",
    },
    "loggers": {
        "django": {
            "handlers": ["console"],
            "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"),
            "propagate": False,
        },
    },
}

با تنظیم DJANGO_LOG_LEVEL=DEBUG می‌توانید تمام لاگ‌های دیباگ Django را ببینید.


۳. ذخیرهٔ لاگ‌ها در فایل

این پیکربندی پیام‌های Django را در یک فایل ذخیره می‌کند.


LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "file": {
            "level": "DEBUG",
            "class": "logging.FileHandler",
            "filename": "/path/to/django/debug.log",
        },
    },
    "loggers": {
        "django": {
            "handlers": ["file"],
            "level": "DEBUG",
            "propagate": True,
        },
    },
}

حتماً مسیر فایل را به مکانی قابل‌نوشتن تغییر دهید.


۴. پیکربندی پیشرفته: فیلترها، فرمت‌ها و چندین handler

این مثال یک پیکربندی پیچیده‌تر را نشان می‌دهد.


LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "{levelname} {asctime} {module} {process:d} {thread:d} {message}",
            "style": "{",
        },
        "simple": {
            "format": "{levelname} {message}",
            "style": "{",
        },
    },
    "filters": {
        "special": {
            "()": "project.logging.SpecialFilter",
            "foo": "bar",
        },
        "require_debug_true": {
            "()": "django.utils.log.RequireDebugTrue",
        },
    },
    "handlers": {
        "console": {
            "level": "INFO",
            "filters": ["require_debug_true"],
            "class": "logging.StreamHandler",
            "formatter": "simple",
        },
        "mail_admins": {
            "level": "ERROR",
            "class": "django.utils.log.AdminEmailHandler",
            "filters": ["special"],
        },
    },
    "loggers": {
        "django": {
            "handlers": ["console"],
            "propagate": True,
        },
        "django.request": {
            "handlers": ["mail_admins"],
            "level": "ERROR",
            "propagate": False,
        },
        "myproject.custom": {
            "handlers": ["console", "mail_admins"],
            "level": "INFO",
            "filters": ["special"],
        },
    },
}

این پیکربندی چه می‌کند؟

  • دو formatter:
    • simple: فقط سطح و پیام
    • verbose: سطح، زمان، ماژول، پردازش، thread و پیام
  • دو filter:
    • special: فیلتر سفارشی با پارامتر
    • require_debug_true: فقط هنگام DEBUG=True
  • دو handler:
    • console: نمایش پیام‌های INFO+
    • mail_admins: ارسال پیام‌های ERROR+ به مدیران
  • سه logger:
    • django: ارسال پیام‌ها به کنسول
    • django.request: ارسال خطاها به ایمیل مدیران
    • myproject.custom: ارسال INFO+ به کنسول و ERROR+ به ایمیل

پیکربندی سفارشی Logging

اگر نمی‌خواهید از dictConfig استفاده کنید، می‌توانید سیستم لاگ‌گیری را کاملاً سفارشی کنید.

تنظیم LOGGING_CONFIG مشخص می‌کند Django از چه تابعی برای پیکربندی لاگ‌ها استفاده کند.


LOGGING_CONFIG = "myproject.logging.configure"

غیرفعال‌سازی کامل پیکربندی Logging

برای غیرفعال کردن پیکربندی خودکار Django:


LOGGING_CONFIG = None

import logging.config
logging.config.dictConfig(...)

توجه: پیکربندی دستی باید بعد از تنظیماتی که به آن وابسته است قرار گیرد.


جمع‌بندی

Django یک سیستم logging بسیار انعطاف‌پذیر ارائه می‌دهد که از پیکربندی سادهٔ کنسول تا ساختارهای پیچیده با فیلترها، فرمت‌ها و چندین handler را پشتیبانی می‌کند. با شناخت dictConfig و نحوهٔ کنترل loggers، می‌توانید یک سیستم لاگ‌گیری قدرتمند و مناسب برای توسعه و محیط تولید ایجاد کنید.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

فریم‌ورک Tasks در Django: راهنمای کامل اجرای کارهای پس‌زمینه در Django 6.0

Django 6.0 فریم‌ورک Tasks را معرفی کرده است؛ سیستمی داخلی برای تعریف و صف‌بندی کارهای پس‌زمینه خارج از چرخهٔ request–response. این مقاله نحوهٔ کار Tasks، پیکربندی backendها، تعریف و enqueue کردن Taskها، استفاده از context، و ادغام با سیستم‌های Worker خارجی را توضیح می‌دهد.

ادامه

پشتیبانی Asynchronous در Django: راهنمای کامل Async Views، ORM، Middleware، عملکرد و ایمنی

این مقاله پشتیبانی Django از برنامه‌نویسی غیرهم‌زمان (async) را توضیح می‌دهد. موضوعاتی مانند async views، اجرای Django تحت ASGI، رفتار middleware، قابلیت‌های ORM غیرهم‌زمان، sync_to_async، مدیریت قطع اتصال، نکات عملکردی، و مکانیزم‌های ایمنی Django برای جلوگیری از استفادهٔ ناامن async بررسی می‌شوند.

ادامه

System Check Framework در Django: راهنمای کامل نوشتن، ثبت، اجرا و تست چک‌های سیستمی

System Check Framework در Django مجموعه‌ای از بررسی‌های استاتیک برای تشخیص مشکلات رایج در پروژه است. این مقاله نحوهٔ اجرای چک‌ها، نوشتن چک‌های سفارشی، مدیریت پیام‌ها، برچسب‌گذاری چک‌ها، افزودن چک به مدل‌ها و فیلدها، و نوشتن تست‌های واحد و یکپارچه برای چک‌ها را توضیح می‌دهد.

ادامه

سیگنال‌ها در Django: راهنمای کامل استفاده، اتصال، ارسال و مدیریت Signalها

این مقاله سیستم سیگنال‌های Django را توضیح می‌دهد؛ مکانیزمی برای اطلاع‌رسانی رویدادها بین بخش‌های مختلف برنامه بدون ایجاد وابستگی مستقیم. موضوعاتی مانند نحوهٔ اتصال receiverها، استفاده از decorator، مدیریت senderهای خاص، محل مناسب قرارگیری کد سیگنال‌ها، هشدارهای مهم، و بهترین شیوه‌ها بررسی می‌شوند.

ادامه

آشنایی کامل با Django Settings: پیکربندی، مدیریت محیط، و بهترین شیوه‌ها

این مقاله یک راهنمای جامع دربارهٔ سیستم تنظیمات در Django ارائه می‌دهد. موضوعاتی مانند ساختار فایل تنظیمات، نحوهٔ تعیین DJANGO_SETTINGS_MODULE، استفاده از settings در کد، امنیت، پیکربندی دستی با configure()، استفادهٔ مستقل از Django با django.setup() و ایجاد تنظیمات سفارشی بررسی می‌شوند.

ادامه

سریال‌سازی و دسریال‌سازی در Django: راهنمای کامل کار با Serialization Framework

این مقاله سیستم سریال‌سازی Django را توضیح می‌دهد؛ از نحوهٔ تبدیل مدل‌ها به JSON، XML، YAML و JSONL گرفته تا دسریال‌سازی داده‌ها، سریال‌سازی فیلدهای انتخابی، کار با مدل‌های ارث‌بری، مدیریت روابط، و نکات مهم هنگام ذخیرهٔ داده‌های دسریال‌شده.

ادامه