التسجيل المنظّم
أصدر سجلات بتنسيق JSON لتكون قابلة للقراءة آلياً
التسجيل المنظّم درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
ما المقصود بالتسجيل المنظّم؟
يصدر التسجيل المنظّم سجلات السجل كبيانات قابلة للقراءة آليًا، مثل JSON، بدلًا من نص حر، مما يسهّل فهرستها والبحث فيها وإنشاء التنبيهات بناءً عليها.
import logging, json
def log_json(level, msg, **kw):
record = {"level": level, "msg": msg, **kw}
print(json.dumps(record))
log_json("INFO", "Request received", path="/api/users", method="GET")منسّق JSON مخصص
أنشئوا فئة فرعية من logging.Formatter لإصدار JSON بدلًا من النص العادي.
import logging, json
class JSONFormatter(logging.Formatter):
def format(self, record):
return json.dumps({
"time": self.formatTime(record),
"level": record.levelname,
"name": record.name,
"msg": record.getMessage(),
})
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.getLogger().addHandler(handler)python-json-logger
توفر الحزمة python-json-logger منسّق JSON جاهزًا للاستخدام مع حقول قياسية وإضافية.
# pip install python-json-logger
import logging
from pythonjsonlogger import jsonlogger
logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(jsonlogger.JsonFormatter())
logger.addHandler(handler)
logger.info("User created", extra={"user_id": 42})structlog
structlog مكتبة شائعة من جهات خارجية تفصل تجميع السياق عن التنسيق، وتدعم سلاسل المعالجات.
# pip install structlog
import structlog
log = structlog.get_logger()
log = log.bind(request_id="abc123")
log.info("payment_processed", amount=49.99, currency="USD")ربط السياق باستخدام structlog
يتيح لكم structlog ربط أزواج المفتاح والقيمة بمسجّل لتنتقل إلى جميع الاستدعاءات اللاحقة.
import structlog
log = structlog.get_logger().bind(
service="auth",
env="prod"
)
log.warning("login_failed", user="alice", reason="bad_password")
# {service:auth, env:prod, user:alice, reason:bad_password}إضافة الطوابع الزمنية ومعلومات المستدعي
يمكن للمعالجات إثراء السجلات تلقائيًا. أضيفوا TimeStamper وCallsiteParameterAdder إلى كل سجل.
import structlog
structlog.configure(
processors=[
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.CallsiteParameterAdder([structlog.processors.CallsiteParameter.FILENAME]),
structlog.processors.JSONRenderer(),
]
)تسجيل معرّفات الطلبات في تطبيقات الويب
في إطار عمل ويب، اربطوا معرّف الطلب في بداية كل طلب حتى يتضمنه كل سطر سجل أثناء ذلك الطلب.
import structlog
def middleware(request, call_next):
req_id = request.headers.get("X-Request-Id", generate_id())
log = structlog.get_logger().bind(request_id=req_id)
log.info("request_started", path=request.url.path)
response = call_next(request)
log.info("request_finished", status=response.status_code)
return responseتنسيق سجلات ECS
يُعد Elastic Common Schema (ECS) تنسيقًا قياسيًا لسجلات JSON تستخدمه Elastic Stack. استخدموا ecs-logging مع Python.
# pip install ecs-logging
import logging
import ecs_logging
logger = logging.getLogger("app")
handler = logging.StreamHandler()
handler.setFormatter(ecs_logging.StdlibFormatter())
logger.addHandler(handler)
logger.info("Event logged in ECS format")أنظمة تجميع السجلات
تنتقل سجلات JSON المنظّمة طبيعيًا إلى أدوات التجميع: Elasticsearch/Kibana (ELK) وGrafana Loki وDatadog وAWS CloudWatch Logs Insights.
# Loki query example:
# {app="myservice"} | json | level="ERROR"
# CloudWatch Insights:
# fields @timestamp, level, msg
# | filter level = "ERROR"
# | sort @timestamp descتجنّب PII في السجلات
أزيلوا المعلومات الشخصية القابلة للتعرّف قبل التسجيل. استخدموا معالجًا أو مرشّحًا مخصصًا لإخفاء عناوين البريد الإلكتروني والرموز المميزة وكلمات المرور.
import re
def mask_pii(_, __, event_dict):
msg = event_dict.get("event", "")
event_dict["event"] = re.sub(
r"[\w.+-]+@[\w-]+\.[\w.]+", "***@***.***", msg
)
return event_dictالمفاضلة بين السجلات المنظّمة وغير المنظّمة
تتميز السجلات المنظّمة بسهولة البحث وإنشاء التنبيهات، لكنها مطوّلة. ادمجوا التسجيل المنظّم في بيئة الإنتاج مع تنسيق سهل القراءة للبشر في بيئة التطوير باستخدام إعداد يعتمد على البيئة.
import structlog, os
if os.getenv("ENV") == "production":
renderer = structlog.processors.JSONRenderer()
else:
renderer = structlog.dev.ConsoleRenderer()
structlog.configure(processors=[renderer])تحقّق سريع
ما الميزة الأساسية لسجلات JSON المنظّمة مقارنةً بسجلات النص العادي؟
مراجعة
يصدر التسجيل المنظّم سجلات JSON على شكل أزواج مفتاح وقيمة. استخدموا JSONFormatter أو python-json-logger أو structlog. واربطوا السياق، مثل معرّف الطلب أو المستخدم، في بداية العملية حتى يحمل كل سطر سجل أثناءها ذلك السياق.
الأسئلة الشائعة
هل درس «التسجيل المنظّم» مجاني؟
نعم — نص درس «التسجيل المنظّم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «التسجيل المنظّم»؟
أصدر سجلات بتنسيق JSON لتكون قابلة للقراءة آلياً تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التسجيل المنظّم»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.