لماذا تطبيق Kotlin "الصامت" هو قنبلة موقوتة
\n\nتخيل: لقد قمت بتشغيل خدمة على Kotlin، وهي تعمل كالساعة. المستخدمون سعداء، المقاييس خضراء. ولكن في يوم من الأيام، يقفز الحمل، ويزداد زمن الاستجابة، وأنت لا تعرف السبب. بدون تسجيل ومراقبة، أنت كقبطان سفينة بدون خريطة ورادار. في هذه المقالة، سنشرح كيفية تحويل تطبيقك من "صندوق أسود" إلى نظام شفاف، حيث يمكن رؤية كل عطل بالعين المجردة.
\n\nلن نقوم بنسخ الوثائق. بدلاً من ذلك، سنقدم حالات واقعية، مقتطفات جاهزة، وحلول معمارية تعمل في الإنتاج. هيا بنا.
\n\nتقسيم الفيل: التسجيل مقابل المراقبة
\n\nقبل كتابة الكود، دعنا نتفق على المصطلحات. التسجيل هو تسجيل الأحداث (الأخطاء، التحذيرات، معلومات التصحيح) بشكل منظم أو نصي. المراقبة هي جمع المقاييس (وقت الاستجابة، عدد الطلبات، تحميل وحدة المعالجة المركزية) وتصورها. من الناحية المثالية، يعملان معًا: السجلات ضرورية للتحليل العميق للحادث، والمقاييس للكشف السريع عن الحالات الشاذة.
\n\nإعداد التسجيل في Kotlin: من البسيط إلى المعقد
\n\nاختيار المكتبة: SLF4J + Logback هو المعيار الذهبي
\n\nKotlin يتعامل بشكل ممتاز مع نظام Java البيئي، لذا فإن SLF4J (الواجهة) و Logback (التنفيذ) هما الخيار الأول. إنهما خفيفان، فعالان، ويدعمان التسجيل غير المتزامن.
\n\nأضف إلى build.gradle.kts:
implementation("ch.qos.logback:logback-classic:1.4.14")\nimplementation("io.github.microutils:kotlin-logging-jvm:3.0.5")\n\nkotlin-logging هو غلاف رقيق فوق SLF4J يجعل الكود أنظف. قارن:
\n\nبدون الغلاف:
\nprivate val logger = LoggerFactory.getLogger(MyService::class.java)\nlogger.info("User {} logged in", userId)\n\nمع kotlin-logging:
\nprivate val logger = KotlinLogging.logger {}\nlogger.info { "User $userId logged in" }\n\nالحساب البطيء للسلاسل هو مكافأة للأداء: سيتم تجميع السلسلة فقط إذا كان مستوى التسجيل مفعّلاً.
\n\nتكوين Logback: السجلات المنظمة أمر لا بد منه
\n\nأنشئ logback.xml في src/main/resources:
<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لا تنس إضافة التبعية:
\nimplementation("net.logstash.logback:logstash-logback-encoder:7.4")\n\nكتابة سجلات ذات معنى: السياق هو كل شيء
\n\nالسجلات مثل «حدث خطأ» غير مفيدة. أضف MDC (سياق التشخيص المعين) - إنها مثل العلامات لسجلاتك.
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