مراقبة وتسجيل تطبيقات Kotlin: كيف لا تفوت خطأ في الإنتاج

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا تطبيق Kotlin "الصامت" هو قنبلة موقوتة

\n\n

تخيل: لقد قمت بتشغيل خدمة على Kotlin، وهي تعمل كالساعة. المستخدمون سعداء، المقاييس خضراء. ولكن في يوم من الأيام، يقفز الحمل، ويزداد زمن الاستجابة، وأنت لا تعرف السبب. بدون تسجيل ومراقبة، أنت كقبطان سفينة بدون خريطة ورادار. في هذه المقالة، سنشرح كيفية تحويل تطبيقك من "صندوق أسود" إلى نظام شفاف، حيث يمكن رؤية كل عطل بالعين المجردة.

\n\n

لن نقوم بنسخ الوثائق. بدلاً من ذلك، سنقدم حالات واقعية، مقتطفات جاهزة، وحلول معمارية تعمل في الإنتاج. هيا بنا.

\n\n

تقسيم الفيل: التسجيل مقابل المراقبة

\n\n

قبل كتابة الكود، دعنا نتفق على المصطلحات. التسجيل هو تسجيل الأحداث (الأخطاء، التحذيرات، معلومات التصحيح) بشكل منظم أو نصي. المراقبة هي جمع المقاييس (وقت الاستجابة، عدد الطلبات، تحميل وحدة المعالجة المركزية) وتصورها. من الناحية المثالية، يعملان معًا: السجلات ضرورية للتحليل العميق للحادث، والمقاييس للكشف السريع عن الحالات الشاذة.

\n\n

إعداد التسجيل في Kotlin: من البسيط إلى المعقد

\n\n

اختيار المكتبة: SLF4J + Logback هو المعيار الذهبي

\n\n

Kotlin يتعامل بشكل ممتاز مع نظام Java البيئي، لذا فإن SLF4J (الواجهة) و Logback (التنفيذ) هما الخيار الأول. إنهما خفيفان، فعالان، ويدعمان التسجيل غير المتزامن.

\n\n

أضف إلى build.gradle.kts:

\n\n
implementation("ch.qos.logback:logback-classic:1.4.14")\nimplementation("io.github.microutils:kotlin-logging-jvm:3.0.5")
\n\n

kotlin-logging هو غلاف رقيق فوق SLF4J يجعل الكود أنظف. قارن:

\n\n

بدون الغلاف:

\n
private val logger = LoggerFactory.getLogger(MyService::class.java)\nlogger.info("User {} logged in", userId)
\n\n

مع kotlin-logging:

\n
private val logger = KotlinLogging.logger {}\nlogger.info { "User $userId logged in" }
\n\n

الحساب البطيء للسلاسل هو مكافأة للأداء: سيتم تجميع السلسلة فقط إذا كان مستوى التسجيل مفعّلاً.

\n\n

تكوين Logback: السجلات المنظمة أمر لا بد منه

\n\n

أنشئ logback.xml في src/main/resources:

\n\n
<configuration>\n    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">\n        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>\n    </appender>\n\n    <root level="INFO">\n        <appender-ref ref="CONSOLE"/>\n    </root>\n</configuration>
\n\n

نحن نستخدم LogstashEncoder - فهو يحول السجلات إلى JSON. هذا أمر بالغ الأهمية إذا كنت ترسل السجلات إلى Elasticsearch أو Loki أو أي مجمع آخر. يسهل تحليل سجلات JSON وتصفيتها وتحليلها.

\n\n

لا تنس إضافة التبعية:

\n
implementation("net.logstash.logback:logstash-logback-encoder:7.4")
\n\n

كتابة سجلات ذات معنى: السياق هو كل شيء

\n\n

السجلات مثل «حدث خطأ» غير مفيدة. أضف MDC (سياق التشخيص المعين) - إنها مثل العلامات لسجلاتك.

\n\n
import org.slf4j.MDC\n\nclass OrderService {\n    private val logger = KotlinLogging.logger {}\n\n    fun processOrder(orderId: String, userId: String) {\n        MDC.put("orderId", orderId)\n        MDC.put("userId", userId)\n        try {\n            logger.info { "Processing order" }\n            // منطق الأعمال\n        } catch (e: Exception) {\n            logger.error(e) { "Order processing failed" }\n        } finally {\n            MDC.clear()\n        }\n    }\n}
\n\n

الآن في مجمع السجلات، ستتمكن من العثور على جميع الإدخالات لطلب أو مستخدم معين في ثانية.

\n\n

مراقبة تطبيقات Kotlin:

المدونات

توصيات الكتب