1.1 مقدمة
إنه لأمر محرج أن أقول ذلك. في الآونة الأخيرة ، تم إرسال الشركة إلى شركة العميل لمقابلة مواقع التطوير خارج نطاق الاستعانة بمصادر خارجية. لقد قمت في الأصل بإعداد بعض أسئلة المقابلة ذات الصلة لـ Redis و RabbitMQ و SSM Frameworks وبعض مراجعات المشروع التي قمت بها. ذهبت إلى المقابلة بثقة. نتيجة لذلك ، سأل أحدهم عن ما كان نظام السجل المستخدم في المشروع الأخير بمجرد وصولي؟ كيف يتم تكوين مستوى السجل؟ كنت مرتبكًا في ذلك الوقت. عادة ما اعتني بها من قبل مدير المشروع. لقد بحثت للتو على الإنترنت ولصقه وكان الأمر على ما يرام. بعد أن انتهيت من التحدث ، أعطاني القائم بإجراء المقابلة نظرة عميقة. في ذلك الوقت ، شعرت بالخجل ...
1.2 أخبرني أقل عن القيل والقال وأخبرني قصة تطوير السجل (إذا كنت تعرف بالفعل ، فيمكنك تخطيه وإلقاء نظرة على تكوين السجل 1.3)
للحصول على فهم متعمق لتنفيذ تقنية السجل ، أوصي شخصيًا بقراءة: Logback + SLF4J. بالنسبة لتكوين السجل ، من الأفضل فهم Log4J ، لأن معظم المشاريع تستخدم حاليًا Log4J. حسنًا ، لنبدأ بقصة تطوير السجل:
في عام 1999 ، أصدر مجتمع Apache Open Source Community Log4J ، والذي تسبب في إحساس في عالم البرنامج بأكمله. منذ ذلك الحين ، أصبح المعيار لتسجيل التسجيل وقد استخدمه مبرمجي Java على نطاق واسع. في وقت لاحق ، أصدرت Sun أيضًا آلية التسجيل (java.util.logging ، المشار إليها فيما يلي باسم يوليو) في الإصدار 1.4 ، ولكن لم يتم التعرف على الآلية من قبل الجمهور ، وهو أمر يرثى له حقًا. سرعان ما أطلقت Apache إطار عمل السجل المشترك (الذي يسمح للمطورين بتجريد أساليب تنفيذ السجل دون الانتباه إلى أي تقنية السجل المستخدمة. من حيث Layman ، فأنت تريد الاتصال بـ Didi على هاتفك المحمول. إذا كنت في بكين ، فسوف تتصل بـ Didi من Beijing ، وفي هونغ كونغ ، ستتصل بـ Didi من Hong Kong). يبدو أن هذا الإطار هو ازدراء للشمس. يمكنه العثور تلقائيًا على تقنية السجل واتصالها في البيئة الحالية لإخراج السجل. يمكن أن يدعم إطار السجل log4j أو يوليو. أصبح Commons-Logging+Log4J مزيجًا كلاسيكيًا من سجلات Java لفترة طويلة بعد ذلك. ومع ذلك ، لم يتم تحديث غطس العموم لفترة من الوقت. أتساءل عما إذا كان تصميم غطس العموم لم يكن جيدًا بما فيه الكفاية ، ومن الصعب تحسينه. لماذا تقول ذلك؟ نظرًا لأن إطار التسجيل الممتاز التالي قد ولد SLF4J ، فإن المؤلف (Ceki Gülcü) هو أحد مؤلفي Log4J. إن SLF4J له أكثر أناقة في التصميم ، وقام أيضًا بتطبيق تكنولوجيا التسجيل ، والتي تعد أيضًا متطورة أكثر من Log4J. في هذه المرحلة ، بدأ الوضع الذي يهيمن عليه نظام السجل من قبل Commons-Logging+Log4J في الهز ، ومختلف عمليات الزحام+Log4J؟ SLF4J+LOG4J؟ SLF4J+LOGBACK؟ المزيج هو حقا مفجع. الأمر الأكثر رعبا هو أن Ceki Gülcü Boss ساعد في تحسين Log4J ، ومنذ ذلك الحين ، كانت هناك تقنية تسجيل أخرى في العالم - log4j2. هل سيتعلم هذا من Tencent القيام WeChat و QQ؟ إنه حقًا 666. لذلك ، إذا كنت ترغب في فهم عميق لتكنولوجيا التسجيل ، فيمكنك العثور على معلومات ذات صلة حول Logback + SLF4J. بالنسبة لملف التكوين ، أعتقد أنه يمكنك فقط فهم التفسير التفصيلي لتكوين log4j الذي كتبته أدناه. بعد كل شيء ، تستخدم العديد من الشركات الآن إطار Log4J.
1.3 انتقل إلى الموضوع ، تكوين السجل الأساسي
1. إنشاء ملف log4j.properties جديد ضمن حزمة ClassPath أو Resource (مشروع Maven). المعلمات التالية كافية لتكوين المشروع الأولي. لمزيد من التكوين التفصيلي ،
استمر في عرض تكوين مستوى سجل 1.4 J Log4J ؛
#قم بتعديل مستوى السجل ومصدر الإخراج من خلال مسجل الجذر#أولوية إخراج السجل: تصحيح <info <warn <error <fatal#تحديد مستوى السجل (معلومات) من سجل الجذر ومستعار مصدر الإخراج (console ، myfile)#هذا التعريف المتمثل في الإخراج في وحدة التحكم والملفات فقط من مستوى الإخراج فوق مستوى المعلومات. implementation of the output source console as console output##########Define the output source alias console (that is, the output source defined by the root logger)# The implementation class is ConsoleAppender (console output source) log4j.appender.console=org.apache.log4j.ConsoleAppender #The format converter for specifying the log output format is the PatternLayout implementation class log4j.appender.console.layout = org.apache.log4j.patternlayout#تحديد التنسيق المحدد لإخراج السجل log4j.appender.console.layout.conversionpattern = ٪ d ٪ -5p [٪ c. ٪ m ()] - myfile (أي ، مصدر الإخراج المحدد بواسطة مسجل الجذر)#فئة التنفيذ هي RollingFilePender (مصدر إخراج الملف) log4j.appender.myfile = org.apache.log4j.rollingfileAppender#تحديد مسار التخزين من log4j.appender.myfile.file. log4j.appender.myfile.m axfilesize = 1024kb#تحديد الحد الأقصى لعدة ملفات السجل (احسب 1 من 0 ، أي ما يصل إلى 3 ملفات هنا) log4j.appender.myfile.layout = org.apache.log4j.patternlayout#تحديد التنسيق المحدد لمخرجات السجل log4j.appender.console.layout.conversionpattern = ٪ d ٪ -5p [٪ c. ٪ m ()] - ٪ m ٪ n ####### acord format #### poor time defaul ISO8601 ، ويمكن أيضا تحديد التنسيق. #Definition هو كما يلي: ٪ d {yyy yey mm month dd dd hh ساعة mm minute ss sss sss} ، وسيكون الإخراج: #January 6 ، 2018 14: 47: 45: 590 #٪ p: هذا هو مستوى سجل الإخراج ، هو ، debug ، info ، خطأ ، خطأ فاد. موجود على اليمين) ، يمكنك أن تتعلم منه مثالًا واحدًا #٪ C: الاسم الكامل للفئة حيث يوجد السجل #٪ M: اسم الطريقة التي يوجد بها السجل #٪ M: معلومات السجل #٪ N: إخراج سطر إرجاع Carriage Break #٪ L: رقم إخراج في الرمز2. سجل المكالمات لاختبار نتائج التكوين.
استيراد org.apache.log4j.logmanager ؛ import org.apache.log4j.logger ؛ استيراد org.apache.log4j.propertyconfigurator ؛ فئة عامة logpropertestest {public static void main (args) { /*parse configation files under non classpath log4jpath = system.getProperty ("user.dir")+"// src // log // logproperties // log4j.properties" ؛ propertyConfigurator.Configure (log4jpath) ؛*/ logger log = logManager.getLogger (logPropertest.Class) ؛ log.debug ("debug") ؛ log.info ("المعلومات") ؛ log.Warn ("تحذير") ؛ log.error ("خطأ") ؛ log.fatal ("خطأ فادح") ؛ }}1.4 تكوين مستوى السجل
يمكن تقسيم تكوين مستوى السجل إلى ثلاث فئات. التكوين أعلاه هو تكوين مستوى السجل للمسجل الأصل ، والفئة الثانية هي تكوين مستوى السجل لمسجل الفئة الفرعية ، والفئة الثالثة هي تكوين مستوى السجل لمصدر الإخراج (وحدة التحكم ، وما إلى ذلك). يتم ترتيب أولوية تحليل مستوى السجل من منخفضة إلى عالية. أنا آسف لعدم شرح البيان المحدد بوضوح. يجب أن أكون قادرًا على فهم القضية مباشرة!
1. إذا لم يتم تكوين مستوى السجل للمسجل الأصل (RootLogger) (على افتراض أنه مستوى المعلومات) ، فلن يتم تكوين مستوى السجل في مسجل الفئة الفرعية ، ولم يتم تكوين مستوى السجل لمصدر الإخراج ، ولا يمكن لمصدر الإخراج سوى إخراج مستوى معلومات الإخراج أو أعلى ؛
2. إذا كان مستوى السجل للمسجل الأصل (RootLogger) (على افتراض أنه مستوى المعلومات) ، ومستوى سجل لوجبر الفئة الفرعية (على افتراض أنه مستوى تصحيح الأخطاء) ، ولم يتم تكوين مستوى السجل لمصدر الإخراج ، فإن إخراج مصدر الإخراج أعلى من مستوى التصحيح ؛
3. إذا كان مستوى السجل للمسجل الأصل (RootLogger) (على افتراض أنه مستوى المعلومات) ، ومستوى السجل لمسجل الفئة الفرعية (على افتراض أنه مستوى التصحيح) ، ومستوى السجل لمصدر الإخراج (على افتراض أنه مستوى المعلومات) ، يقوم مصدر الإخراج بإخراج مستوى المعلومات أو أعلى ؛
4. إذا كان مستوى السجل للمسجل الأصل (RootLogger) (على افتراض أنه مستوى المعلومات) ، فلا يتم تكوين مستوى السجل في مسجل الفئة الفرعية ، ويتم تكوين مستوى سجل المسجل الفرعي.
مستوى السجل لمصدر الإخراج (على افتراض أنه مستوى التصحيح) ، ثم يقوم مصدر الإخراج بإخراج مستوى المعلومات أو أعلى ؛
لذلك ، من الحالة المذكورة أعلاه ، يمكننا أن نعرف أن هناك علاقتين منطقيتين بين المسجل ومستوى سجل إخراج مصدر الإخراج:
1. إذا لم يحدد مصدر الإخراج مستوى السجل ، فسوف يرث مستوى السجل الأقرب إلى مسجل الفئة الفرعية ؛ إذا لم يحدد مسجل الفئة الفرعية مستوى السجل ، فسوف يرث المسجل الأصل الأقرب إلى مسجل الأم.
2. عند طباعة السجل ، سيقارن مصدر الإخراج بمستوى السجل المحدد بواسطة مسجل الفئة الفرعية الأقرب إليه. إذا كان المستوى المحدد بواسطة مصدر الإخراج أعلى من مسجل الفئة الفرعية ، فسيتم إخراج السجل وفقًا لمستوى السجل المحدد بواسطة مصدر الإخراج ، والعكس صحيح.
لذلك ، في المشروع ، يمكنك تكوين مستوى السجل وفقًا لطريقة التكوين اليومية:
#Control مستوى سجل المسجل الأصل هو معلومات. بشكل افتراضي ، يتم إخراج السجلات فقط فوق مستوى المعلومات فقط ضمن جميع الوحدات النمطية log4j.rootlogger = info ، وحدة التحكم#Console#التحكم في مستوى سجل الوحدة النمطية بشكل منفصل للخطأ ، والسجلات يتم الإخراج فقط عند حدوث استثناء log4j.logger.log.logproperties = خطأ#التحكم في مستوى السجل للفئة منفصلة عن التصحيح ، log4j.logger.log.logproperties.logpropertestiest = debug ##############################################################################################################################################################################################################################################################. ## طلب ## طلب ## طلب #حدد مستوى السجل لمصدر الإخراج الحالي. مع التكوين السابق ، لا تحتاج إلى تكوين هذا العنصر #log4j.appender.console.throshold = info #حدد تنسيق إخراج السجل: تنسيق مرن log4j.appender.console.layout = org.apache.log4j.patternlayout #content من format log4j.appender.console.consoled.conversion. [٪ c. ٪ m ()] - ٪ m ٪ n
1.5 الخاتمة
في هذه المرحلة ، أعتقد أن لديك فهمًا أساسيًا لتكوين السجل. هناك العديد من الأشياء في المقالة التي قد تكون خاطئة ، وجميع الأبطال مرحب بهم للإشارة إليهم. كتبت مقالًا لتلخيصه من أجل أن أتمكن من فهم تكوين هذه التقنية بعمق ، بحيث يكون لدي فهم أعمق لها.