تهيئة Logback
المُلحِقات والأنماط والمستويات
تهيئة Logback درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما هي Logback؟
إن Logback واجهة خلفية شائعة لـ SLF4J، وقد كتبها المؤلف نفسه الذي كتب Log4j. وهي تنفّذ فعليًا عمليات التسجيل التي تصفها استدعاءات SLF4J.
تُعدّلون إعداداتها باستخدام ملف اسمه logback.xml في مسار الأصناف، وعادةً ما يكون ضمن src/main/resources.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("Logback reads logback.xml at startup");
}
}لبنات البناء الثلاث
يتضمن إعداد Logback ثلاثة مفاهيم أساسية:
- Logger: مصدر مُسمى لأحداث السجل، وله مستوى.
- Appender: وجهة، مثل وحدة التحكم أو ملف.
- Encoder/Layout: ينسّق الحدث في صورة نص.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("logger -> appender -> encoder -> output");
}
}مُلحِق وحدة التحكم
يرسل أبسط إعداد كل شيء إلى وحدة التحكم. ويتحكم نمط المرمّز في تنسيق السطر.
يوجد ملف XML هذا في logback.xml، وليس في كود Java الخاص بكم.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>فهم النمط
تبدأ كلمات تحويل النمط بالرمز %:
%dللطابع الزمني، و%levelللمستوى.%loggerلاسم المسجّل، و%threadللخيط.%msgلرسالتكم، و%nلسطر جديد.
يضيف %-5level مسافات إلى يسار المستوى ليبلغ عرضه 5.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
// Output rendered by pattern: time LEVEL logger - message
log.info("hello");
}
}المسجّل الجذر والمستويات
يعيّن العنصر <root> المستوى الافتراضي للتطبيق بأكمله، كما يحدد المُلحقات التي يكتب إليها.
يعني تعيين level="info" إصدار INFO وWARN وERROR، مع حجب DEBUG وTRACE.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
</appender>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>المستويات لكل حزمة
أضيفوا عنصر <logger> لتجاوز مستوى حزمة معينة. يتيح لكم ذلك تفعيل DEBUG في كودكم مع إبقاء مكتباتكم هادئة.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
</appender>
<logger name="com.example.app" level="debug" />
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>مُلحِق الملفات الدوّارة
في بيئة الإنتاج، تكتبون عادةً إلى ملفات تُدوَّر يوميًا أو حسب الحجم، حتى لا تستمر السجلات في النمو بلا حدود.
ينشئ RollingFileAppender مع سياسة تعتمد على الوقت ملفًا واحدًا لكل يوم، ويحتفظ بسجل تاريخي محدود.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>مُلحقات متعددة في الوقت نفسه
يمكن للمسجّل الجذر الإشارة إلى عدة مُلحقات، ولذلك تُرسل السجلات إلى وحدة التحكم والملف في الوقت نفسه.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %msg%n</pattern></encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/app.log</file>
<encoder><pattern>%d %-5level %msg%n</pattern></encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>طباعة MDC
لتضمين سياق MDC، مثل معرّف الطلب، في كل سطر، أضيفوا %X{key} إلى النمط.
بعد ذلك، ستظهر تلقائيًا أي قيمة تضعونها في MDC.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
MDC.put("requestId", "req-1234");
// Pattern: %X{requestId} %-5level %msg%n
log.info("handled");
MDC.clear();
}
}التراكمية
تنتقل أحداث المسجّل افتراضيًا أيضًا إلى مُلحقات أسلافه. وتُسمى هذه الخاصية التراكمية.
إذا كان لمسجّل حزمة مُلحق خاص به ولم ترغبوا في ظهور المخرجات مكررة، فعيّنوا additivity="false" عليه.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%-5level %logger - %msg%n</pattern></encoder>
</appender>
<logger name="com.example.audit" level="info" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>إعادة التحميل التلقائي والمتغيرات
يمكن لـ Logback إعادة تحميل الإعدادات دوريًا باستخدام <configuration scan="true">، وهو أمر مفيد لتغيير المستويات دون إعادة التشغيل.
يمكنكم أيضًا قراءة الخصائص، مثل دليل السجلات، باستخدام العناصر النائبة ${LOG_DIR}.
<configuration scan="true" scanPeriod="30 seconds">
<property name="LOG_DIR" value="logs" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_DIR}/app.log</file>
<encoder><pattern>%d %-5level %msg%n</pattern></encoder>
</appender>
<root level="info"><appender-ref ref="FILE" /></root>
</configuration>اختبار سريع
اختبروا معرفتكم بإعداد Logback.
مراجعة
لقد تعلمتم إعداد Logback:
- يوجد الإعداد في
logback.xml، ويتضمن المسجّلات والمُلحقات والمرمّزات. - تنسّق الأنماط الأسطر باستخدام
%dو%levelو%msgو%X{}. - يدوّر RollingFileAppender السجلات؛ فعيّنوا مستويات لكل حزمة واضبطوا التراكمية.
- فعّلوا
scanلإعادة الإعداد مباشرةً.
لقد أتممتم دورة التسجيل.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("Logback configuration course complete");
}
}الأسئلة الشائعة
هل درس «تهيئة Logback» مجاني؟
نعم — نص درس «تهيئة Logback» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «تهيئة Logback»؟
المُلحِقات والأنماط والمستويات تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تهيئة Logback»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.