logging --- تسجيل الأحداث

توفر هذه الوحدة مجموعة فرعية خفيفة الوزن من حزمة logging القياسية في Python مُكيّفة لـ MicroPython. وهي تدعم التسجيل وفق المستويات من خلال كائنات Logger ذات أسماء هرمية، ومجموعة صغيرة من المعالِجات (StreamHandler وFileHandler)، والتنسيق بأسلوب printf عبر Formatter، إضافة إلى دوال مساعِدة على مستوى الوحدة تعادل تلك التي تعمل على المُسجِّل الجذر.

تتبع هذه الوحدة واجهة CPython المألوفة بدقة كافية بحيث ينبغي أن تعمل التطبيقات البسيطة المكتوبة للمكتبة القياسية دون أي تعديل. أما المُرشِّحات، وقفل تعدد العمليات، وصيغة ملف الإعداد، ومعظم أصناف المعالِجات فلا تُوفَّر.

ثوابت المستويات

logging.CRITICAL: int

القيمة العددية 50. تُستخدم للأخطاء غير القابلة للاسترداد.

logging.ERROR: int

القيمة العددية 40. تُستخدم للمشكلات الخطيرة.

logging.WARNING: int

القيمة العددية 30. المستوى الافتراضي لمُسجِّل جذر مُعَدّ حديثًا.

logging.INFO: int

القيمة العددية 20. تُستخدم لرسائل التأكيد.

logging.DEBUG: int

القيمة العددية 10. تُستخدم للمخرجات التشخيصية الدقيقة.

logging.NOTSET: int

القيمة العددية 0. تشير إلى مُسجِّل لم يُضبط له مستوى (يُورَّث المستوى الفعّال عندئذٍ من المُسجِّل الجذر أو من WARNING).

الدوال

logging.getLogger(name: str | None = None) Logger

تُرجِع Logger المسجَّل تحت الاسم name، وتُنشئه عند أول استخدام. إذا كان name يساوي None فيُرجَع المُسجِّل الجذر. ويستدعي أول نداء بـ name="root" (أو مع ترك name غير محدد) ضمنيًا الدالة basicConfig لإرفاق StreamHandler افتراضي يكتب إلى sys.stderr.

logging.log(level: int, msg: str, *args) None

تُسجِّل رسالة عند المستوى level على المُسجِّل الجذر. تُدمَج args داخل msg باستخدام التنسيق بأسلوب printf عبر %؛ ويُستخدَم وسيط القاموس المفرد كخريطة.

logging.debug(msg: str, *args) None

يعادل getLogger().debug(msg, *args).

logging.info(msg: str, *args) None

يعادل getLogger().info(msg, *args).

logging.warning(msg: str, *args) None

يعادل getLogger().warning(msg, *args).

logging.error(msg: str, *args) None

يعادل getLogger().error(msg, *args).

logging.critical(msg: str, *args) None

يعادل getLogger().critical(msg, *args).

logging.exception(msg: str, *args, exc_info: bool | BaseException = True) None

يعادل getLogger().exception(msg, *args, exc_info=exc_info). يُسجِّل الرسالة عند ERROR ويُنسِّق إضافةً إلى ذلك أثر الاستثناء النشط عندما تكون exc_info صادقة. وإذا كانت exc_info نفسها كائن BaseException فيُستخدَم أثر ذلك الاستثناء؛ وإلا فيُرجَع إلى sys.exc_info() عند توافرها.

logging.shutdown() None

تُغلق كل معالِج مُرفَق بكل مُسجِّل معروف وتنسى المُسجِّلات. يُسجَّل تلقائيًا عبر sys.atexit عند توافر ذلك الخطّاف.

logging.addLevelName(level: int, name: str) None

تربط الاسم النصي name بالمستوى العددي level بحيث يستطيع Formatter عرضه عبر %(levelname)s.

logging.basicConfig(filename: str | None = None, filemode: str = 'a', format: str | None = None, datefmt: str | None = None, level: int = WARNING, stream=None, encoding: str = 'UTF-8', force: bool = False) None

تُعِدّ المُسجِّل الجذر بمعالِج واحد.

إذا قُدِّم filename فيُنشأ FileHandler باستخدام filemode وencoding؛ وإلا فيُستخدَم StreamHandler يكتب إلى stream (الافتراضي sys.stderr).

يُمرَّر format وdatefmt إلى Formatter جديد.

يضبط level مستوى المعالِج ومستوى المُسجِّل الجذر معًا.

إذا كان المُسجِّل الجذر يملك بالفعل معالِجات فلا تفعل هذه الدالة شيئًا، إلا إذا كان force يساوي True، وفي هذه الحالة تُغلق المعالِجات الموجودة وتُستبدل.

الأصناف

class logging.Logger(name: str, level: int = NOTSET)

مُسجِّل ذو اسم. أنشئ المُسجِّلات عبر getLogger بدلًا من إنشائها مباشرةً، حتى تتمكن getLogger من إرجاع النسخة نفسها للاسم نفسه.

name: str

الاسم المنقَّط للمُسجِّل.

level: int

المستوى العددي المُعَدّ. القيمة 0 (NOTSET) تعني "وراثة".

handlers: list

قائمة نُسخ Handler المُرفَقة بهذا المُسجِّل. وعندما تكون فارغة، تُرسَل الرسائل إلى معالِجات المُسجِّل الجذر.

setLevel(level: int) None

يضبط مستوى عتبة المُسجِّل.

isEnabledFor(level: int) bool

تُرجِع True إذا كانت رسالة عند المستوى level ستُعالَج بواسطة هذا المُسجِّل.

getEffectiveLevel() int

تُرجِع أول قيمة غير صفرية من بين: مستوى هذا المُسجِّل، أو مستوى المُسجِّل الجذر، أو WARNING.

log(level: int, msg: str, *args) None

تُسجِّل msg عند المستوى level. تُدمَج args داخل msg باستخدام عامل %؛ وإذا كان الوسيط الموضعي الأول قاموسًا فيُستخدَم كخريطة.

debug(msg: str, *args) None

تُسجِّل msg عند DEBUG.

info(msg: str, *args) None

تُسجِّل msg عند INFO.

warning(msg: str, *args) None

تُسجِّل msg عند WARNING.

error(msg: str, *args) None

تُسجِّل msg عند ERROR.

critical(msg: str, *args) None

تُسجِّل msg عند CRITICAL.

exception(msg: str, *args, exc_info: bool | BaseException = True) None

تُسجِّل msg عند ERROR، وتُلحِق الأثر المُنسَّق عندما تكون exc_info صادقة. وإذا كانت exc_info نسخة من BaseException فيُعرَض أثر ذلك الاستثناء؛ وإلا فيُرجَع إلى الاستثناء النشط عبر sys.exc_info().

addHandler(handler: Handler) None

تُرفِق handler بهذا المُسجِّل.

hasHandlers() bool

تُرجِع True إذا كان أي معالِج مُرفَقًا بهذا المُسجِّل.

class logging.Handler(level: int = NOTSET)

الصنف الأساس لجميع المعالِجات. تُنفِّذ الأصناف الفرعية emit().

level: int

مستوى عتبة المعالِج.

formatter: 'Formatter | None'

كائن Formatter النشط، أو None.

setLevel(level: int) None

يضبط مستوى عتبة المعالِج.

setFormatter(formatter: Formatter) None

يُرفِق formatter بهذا المعالِج.

format(record: LogRecord) str

يعرض record باستخدام المُنسِّق المُعَدّ.

close() None

يحرِّر الموارد التي يحتفظ بها المعالِج. تُستدعى من shutdown ومن FileHandler عند إغلاقه.

class logging.StreamHandler(stream=None)

معالِج يكتب السجلات المُنسَّقة، متبوعةً بـ self.terminator (وقيمته الافتراضية "\n")، إلى stream. القيمة الافتراضية لـ stream هي sys.stderr.

stream

كائن مجرى الوجهة.

terminator: str

سلسلة تُلحَق بعد كل سجل مُنسَّق. قيمتها الافتراضية "\n".

emit(record: LogRecord) None

يكتب record إلى stream إذا كان مستواه يفي بعتبة المعالِج.

close() None

يدفق المجرى الأساسي عندما يوفِّر دالة flush.

class logging.FileHandler(filename: str, mode: str = 'a', encoding: str = 'UTF-8')

صنف فرعي من StreamHandler يفتح filename بالنمط mode والترميز encoding المُعطَيين ويكتب السجلات المُنسَّقة إليه. يُغلق الملف الأساسي عند close().

class logging.Formatter(fmt: str | None = None, datefmt: str | None = None)

يعرض نُسخ LogRecord كسلاسل نصية.

fmt قالب بأسلوب printf. المفاتيح المُتعرَّف عليها هي %(name)s و%(message)s و%(msecs)d و%(asctime)s و%(levelname)s. وعند تركه غير مضبوط فقيمته الافتراضية "%(levelname)s:%(name)s:%(message)s".

datefmt هو قالب time.strftime المُستخدَم لعرض %(asctime)s. قيمته الافتراضية "%Y-%m-%d %H:%M:%S".

usesTime() bool

تُرجِع True إذا كان قالب التنسيق يشير إلى asctime.

formatTime(datefmt: str, record: LogRecord) str | None

تُنسِّق record.ct باستخدام time.strftime وdatefmt. وتُرجِع None على المنصات التي لا تتوافر فيها time.strftime.

format(record: LogRecord) str

تعرض record. إذا كان القالب يستخدم asctime، فتُستدعى formatTime() أولًا لتعبئة record.asctime.

class logging.LogRecord

حاوية للبيانات المُمرَّرة من Logger إلى معالِجاته. تُعبَّأ النُسخ عبر set()؛ وتعيد تطبيقات المُسجِّل استخدام سجل واحد لكل مُسجِّل لتقليل التخصيصات.

name: str

اسم المُسجِّل المصدري.

levelno: int

المستوى العددي لهذا السجل.

levelname: str

الاسم النصي للمستوى.

message: str

رسالة السجل المُنسَّقة بالكامل.

ct: float

وقت الإنشاء كما تُرجِعه time.time().

msecs: int

المكوّن بالملي ثانية من ct.

asctime: str | None

طابع زمني مقروء للإنسان؛ يُعبَّأ بطريقة كسولة بواسطة Formatter.

set(name: str, level: int, message: str) None

تُهيّئ السجل بالقيم المُعطاة وتلتقط الوقت الحالي.