JavaRush /مدونة جافا /Random-AR /لماذا هناك حاجة للتسجيل؟

لماذا هناك حاجة للتسجيل؟

نشرت في المجموعة
مرحبًا! عند كتابة المحاضرات، ألاحظ بشكل خاص ما إذا كان سيتم استخدام موضوع معين بالتأكيد في العمل الحقيقي. لماذا تحتاج إلى التسجيل - 1 لذلك، انتبه! الموضوع الذي سنتطرق إليه اليوم سيكون بالتأكيد مفيدًا لك في جميع مشاريعك منذ اليوم الأول للعمل. سنتحدث عن التسجيل. هذا الموضوع ليس صعبًا على الإطلاق (أود أن أقول إنه سهل). ولكن في وظيفتك الأولى، سيكون هناك بالفعل ما يكفي من الضغط لمواصلة التعامل مع الأشياء الواضحة، لذا من الأفضل أن تقوم بفرزها بدقة الآن :) لذا، فلنبدأ. ما هو التسجيل؟ التسجيل هو تسجيل بيانات في مكان ما حول تشغيل البرنامج. المكان الذي تكتب فيه هذه البيانات يسمى " السجل ". هناك سؤالان في آن واحد: أين وما هي البيانات التي يتم تسجيلها؟ لنبدأ بـ "أين". يمكنك تسجيل بيانات تشغيل البرنامج في العديد من الأماكن المختلفة. على سبيل المثال، أثناء دراستك، غالبًا ما تقوم بإخراج البيانات إلى وحدة التحكم باستخدام ملفات System.out.println(). هذا هو التسجيل الحقيقي، وإن كان أبسط. بالطبع، هذا ليس مناسبًا جدًا للعميل أو فريق دعم المنتج: من الواضح أنهم لن يرغبوا في تثبيت IDE ومراقبة وحدة التحكم :) هناك أيضًا تنسيق أكثر دراية لتسجيل المعلومات - في ملف نصي. من الأسهل على الأشخاص قراءتها بهذه الطريقة، وبالتأكيد تخزينها أسهل بكثير! الآن السؤال الثاني: ما هي البيانات المتعلقة بتشغيل البرنامج التي يجب تسجيلها في السجل؟ ولكن هنا كل شيء يعتمد عليك! نظام تسجيل Java مرن للغاية. يمكنك تكوينه بطريقة يتم من خلالها تسجيل التقدم الكامل لبرنامجك. من ناحية، هذا أمر جيد. لكن من ناحية أخرى، تخيل الحجم الذي يمكن أن تصل إليه سجلات Facebook أو Twitter إذا تم كتابة كل شيء هناك. ربما تمتلك مثل هذه الشركات الكبيرة القدرة على تخزين هذا القدر من المعلومات. لكن تخيل مدى صعوبة البحث عن معلومات حول خطأ فادح واحد في سجلات بحجم 500 غيغابايت من النص؟ إنها أسوأ حتى من إبرة في كومة قش. لذلك، يمكن تكوين تسجيل الدخول إلى Java بحيث تتم كتابة بيانات الخطأ فقط في السجل (السجل). أو حتى مجرد أخطاء فادحة! على الرغم من أن قول "تسجيل الدخول إلى Java" ليس صحيحًا تمامًا. الحقيقة هي أن الحاجة إلى التسجيل نشأت بين المبرمجين قبل إضافة هذه الوظيفة إلى اللغة. وبحلول الوقت الذي أصبحت فيه Java مكتبة تسجيل خاصة بها، كان الجميع يستخدمون مكتبة log4j بالفعل. إن تاريخ ظهور تسجيل الدخول في Java هو في الواقع طويل جدًا وغني بالمعلومات، ويمكنك قراءة هذا المنشور في وقت فراغك على حبري . باختصار، لدى Java مكتبة تسجيل خاصة بها، لكن لا أحد يستخدمها تقريبًا :) لاحقًا، عندما ظهرت عدة مكتبات تسجيل مختلفة، وبدأ جميع المبرمجين في استخدام مكتبات مختلفة، نشأت مشكلة التوافق. لمنع الأشخاص من القيام بنفس الشيء باستخدام عشرات المكتبات المختلفة بواجهات مختلفة، تم إنشاء إطار التجريد slf4j("واجهة تسجيل الخدمة لجافا"). يطلق عليه اسم التجريد لأنه على الرغم من أنك تستخدم فئات slf4j وتستدعي أساليبها، إلا أنها تحتوي تحت الغطاء على جميع أطر التسجيل السابقة قيد التشغيل: log4j، وjava.util.logging القياسي وغيرها. إذا كنت تحتاج حاليًا إلى بعض الميزات المحددة في log4j التي لا تمتلكها المكتبات الأخرى، ولكنك لا ترغب في ربط المشروع بهذه المكتبة تحديدًا بشكل صارم، فما عليك سوى استخدام slf4j. وسوف تقوم بالفعل "بسحب" أساليب log4j. إذا غيرت رأيك وقررت أنك لم تعد بحاجة إلى ميزات log4j، فأنت بحاجة فقط إلى إعادة تكوين "المجمع" (أي slf4j) لاستخدام مكتبة أخرى. لن يتوقف الكود الخاص بك عن العمل، لأنك تستدعي فيه أساليب slf4j، وليس مكتبة معينة. انحراف صغير. لكي تعمل الأمثلة التالية، تحتاج إلى تنزيل مكتبة slf4j من هنا ، ومكتبة log4j من هنا . بعد ذلك، نحتاج إلى فك ضغط الأرشيف وإضافة ملفات jar التي نحتاجها إلى مسار الفصل عبر Intellij IDEA. عناصر القائمة: ملف -> هيكل المشروع -> المكتبات حدد الجرار الضرورية وأضفها إلى المشروع (توجد العديد من الجرار في الأرشيفات التي قمنا بتنزيلها، انظر إلى الجرار التي تحتاجها في الصور) لماذا تحتاج إلى التسجيل - 2لماذا تحتاج إلى التسجيل - 3ملاحظة - هذه التعليمات مخصصة لهؤلاء الطلاب الذين لا يعرفون كيفية استخدام Maven. إذا كنت تعرف كيفية استخدامه، فمن الأفضل أن تحاول البدء به: فهو عادةً ما يكون أسهل بكثير. إذا كنت تستخدم Maven ، أضف هذه التبعية:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
رائع، لقد قمنا بترتيب الإعدادات :) دعونا نلقي نظرة على كيفية عمل slf4j. كيف يمكننا التأكد من تسجيل تقدم البرنامج في مكان ما؟ لهذا نحتاج إلى شيئين - المُسجل والمُلحق . لنبدأ بالأول. المسجل هو كائن يدير عملية حفظ السجلات بشكل كامل . يعد إنشاء المسجل أمرًا سهلاً للغاية: يتم ذلك باستخدام طريقة ثابتة - . كمعلمة للأسلوب، تحتاج إلى اجتياز الفصل الذي سيتم تسجيل عمله. لنقم بتشغيل الكود الخاص بنا: LoggerFactory.getLogger()
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
إخراج وحدة التحكم: ERROR StatusLogger لم يتم العثور على ملف تكوين Log4j 2. استخدام التكوين الافتراضي (تسجيل الأخطاء فقط في وحدة التحكم)، أو التكوينات المقدمة برمجيًا من قبل المستخدم. قم بتعيين خاصية النظام "log4j2.debug" لإظهار تسجيل التهيئة الداخلي لـ Log4j 2. راجع https://logging.apache.org/log4j/2.x/manual/configuration.html للحصول على إرشادات حول كيفية تكوين Log4j 2 15:49:08.907 [الرئيسي] خطأ MyTestClass - حدث خطأ في البرنامج! ما الذي نراه هنا؟ أولا نرى رسالة خطأ. لقد ظهر لأننا نفتقر حاليًا إلى الإعدادات اللازمة. لذلك، يمكن للمسجل لدينا الآن فقط إخراج رسائل الخطأ (ERROR) وإلى وحدة التحكم فقط. logger.info()لم يتم تنفيذ الطريقة . لكنها logger.error()نجحت! تعرض وحدة التحكم التاريخ الحالي وطريقة حدوث الخطأ ( main)، وكلمة خطأ ورسالتنا! الخطأ هو مستوى التسجيل. بشكل عام، إذا تم وضع علامة على إدخال السجل بالكلمة خطأ، فهذا يعني أنه حدث خطأ في تلك المرحلة في البرنامج. إذا تم وضع علامة على الإدخال بكلمة INFO، فهذا يعني أنه مجرد معلومات حالية حول التشغيل العادي للبرنامج. تحتوي مكتبة SLF4J على عدد لا بأس به من مستويات التسجيل المختلفة التي تسمح لك بتكوين التسجيل بمرونة. من السهل جدًا إدارتها: تم بالفعل تضمين كل المنطق الضروري في الفصل Logger. تحتاج فقط إلى استدعاء الطرق اللازمة. إذا كنت ترغب في نشر رسالة عادية، اتصل بالرقم logger.info(). رسالة خطأ - logger.error(). عرض تحذير - logger.warn() الآن دعونا نتحدث عن المُلحق . المُلحق هو المكان الذي تأتي منه بياناتك. يمكنك القول أن عكس مصدر البيانات هو "النقطة ب". بشكل افتراضي، يتم إخراج البيانات إلى وحدة التحكم. يرجى ملاحظة أنه في المثال السابق لم يكن علينا تكوين أي شيء: ظهر النص في وحدة التحكم نفسها، ولكن المسجل من مكتبة log4j يمكنه فقط إخراج رسائل مستوى الخطأ إلى وحدة التحكم. من الواضح أنه من الملائم أكثر للأشخاص قراءة السجلات من ملف نصي وتخزين السجلات في نفس الملفات. لتغيير السلوك الافتراضي للمسجل، نحتاج إلى تكوين مُلحق الملف الخاص بنا . للبدء، تحتاج إلى إنشاء ملف log4j.xml مباشرة في مجلد src ، أو في مجلد الموارد، إذا كنت تستخدم Maven، أو في مجلد الموارد، في حالة استخدام Maven. أنت بالفعل على دراية بتنسيق xml، وقد ألقينا مؤخرًا محاضرة عنه :) وهذا هو محتواه:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
لا يبدو الأمر معقدًا بشكل خاص :) ولكن دعونا نستعرض المحتويات.
<Configuration status="INFO">
هذا هو ما يسمى مسجل الحالة. إنه غير مرتبط بالمسجل الخاص بنا ويتم استخدامه داخليًا بواسطة log4j. يمكنك تعيين الحالة = "TRACE" بدلاً من الحالة = "INFO"، وسيتم إخراج جميع المعلومات حول الأعمال الداخلية لـ log4j إلى وحدة التحكم (يقوم مسجل الحالة بإخراج البيانات إلى وحدة التحكم، حتى لو كان مُلحق البرنامج الخاص بنا هو ملف -قائم على). نحن لسنا بحاجة إلى هذا الآن، لذلك سنترك كل شيء كما هو.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
هنا نقوم بإنشاء المُلحق الخاص بنا. تشير العلامة <File>إلى أنه سيكون ملفًا. name="MyFileAppender"- اسم الملحق لدينا. fileName="C:\Users\Username\Desktop\testlog.txt"- المسار إلى ملف السجل حيث سيتم كتابة كافة البيانات. append="true"— ما إذا كان من الضروري كتابة بيانات إضافية في نهاية الملف. وفي حالتنا سيكون هذا هو الحال. إذا تم التعيين على false ، فسيتم حذف محتويات السجل القديم في كل مرة يتم فيها تشغيل البرنامج مرة أخرى. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- هذه هي إعدادات التنسيق. يمكننا هنا استخدام التعبيرات العادية لتخصيص تنسيق النص في سجلنا.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
نحدد هنا مستوى التسجيل (مستوى الجذر). لدينا مجموعة مستويات INFO: أي أن جميع الرسائل ذات المستويات الأعلى من INFO (وفقًا للجدول الذي نظرنا إليه أعلاه) لن يتم تضمينها في السجل. سيكون لدينا 3 رسائل في برنامجنا: واحدة معلومات، وواحدة تحذير، وواحدة خطأ. مع التكوين الحالي، سيتم كتابة جميع الرسائل الثلاث في السجل. إذا قمت بتغيير مستوى الجذر إلى ERROR، فسيتم تسجيل الرسالة الأخيرة فقط من LOGGER.error(). بالإضافة إلى ذلك، يتم وضع رابط للملحق هنا. لإنشاء مثل هذا الارتباط، تحتاج إلى <Root>إنشاء علامة داخل العلامة <ApprenderRef>وإضافة المعلمة إليها ref=”Name твоего аппендера”. لقد أنشأنا اسم المُلحق هنا، في حالة نسيانك: <File name="MyFileAppender" وهذا هو رمز برنامجنا!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
بالطبع، إنها ملتوية بعض الشيء (يعد التقاط RuntimeException فكرة متواضعة)، ولكنها مثالية لأغراضنا :) فلننفذ طريقتنا main()4 مرات متتالية وننظر إلى ملف testlog.txt الخاص بنا. ليست هناك حاجة لإنشائه مسبقًا: ستقوم المكتبة بذلك تلقائيًا. كل شيء يعمل! :) الآن لديك مسجل تكوينه. يمكنك تجربة بعض البرامج التي كتبتها مسبقًا، وإضافة استدعاءات المسجل إلى جميع الطرق، وإلقاء نظرة على السجل الناتج :) لمزيد من القراءة، أوصي بشدة بهذا المقال . هناك تتم مناقشة موضوع التسجيل بعمق، ولن يكون من السهل قراءته في جلسة واحدة. لكنه يحتوي على الكثير من المعلومات الإضافية المفيدة. على سبيل المثال، ستتعلم كيفية تكوين المسجل بحيث يقوم بإنشاء ملف نصي جديد إذا وصل ملف testlog.txt الخاص بنا إلى حجم معين :) وهذه نهاية درسنا! لقد تعلمت اليوم عن موضوع مهم للغاية، وهذه المعرفة بالتأكيد ستكون مفيدة لك في عملك المستقبلي. نراكم مرة أخرى! :)
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION