مقدمة
عندما يصبح حجم المشروع أكبر وأكبر ، سيتم تقديم وحدات جديدة بشكل مستمر. ستقوم الوحدات المختلفة بطباعة سجلاتها الخاصة ، والتي ستؤدي في النهاية إلى عدم قدرة السجل على عرضها. على سبيل المثال ، في مشروعي ، توجد السجلات التالية:
من بينها ، مقدار بيانات السجل الخاصة بسجل الرسائل وخيط الخلفية كبير جدًا. إذا تمت طباعة جميع السجلات في ملف واحد واستخدام ملف tail -f log.log ، فستجد أن السجلات يتم تمريرها بسرعة ، ولا يمكنك عرض أو حتى تحديد موقع SQL أو سجل الوصول إلى الخدمة.
يتمثل الحل في تصنيف وإخراج سجلات مختلفة بحيث لا تؤثر السجلات المتبادلة على بعضها البعض. يمكن للوصول إلى السجلات من خلال واجهات مهمة بشكل خاص تحديد موقع المشكلات واستكشافها بسهولة.
الخطوة 1: تكوين في log4j.properties
أول نشر جميع تكوينات log4j.properties الخاصة بي:
log4j.rootlogger = info ، وحدة التحكم ، ملف log4j.appender.console = net.czt.log.asynconconsoleppenderlog4j.appender.console.layout = org.apache.log4j.patternlayoutlog4j.appender.console.layout.convers ٪ -17C {2} (٪ 13f: ٪ l) ٪ x {user_id} | ٪ x {user_ip} | ٪ x {server_address} | ٪ x {server_name} | ٪ x {request_uri} | ٪ x {session_id} - ٪ m ٪ nlog4j.appender.console.buffersize = 10000log4j.appender.console.encoding = UTF-8 log4j.appender.file = org.apache.log4j.rollingfileappenderlog4j.appender.file AckupIndex = 5log4j.appender.file.maxfilesize = 1gblog4j.appender.file.layout = org.apache.log4j.patternlayoutlog4j.appender.file.layout.conversionpattern = [٪-5p] crazyant-web ٪ d {yyyy-mm-dd hh: mm: ss ، sss} ٪ x {user_id} | ٪ x {user_ip} | ٪ x {server_address} | ٪ x {server_name} | ٪ x {request_uri} | ٪ x {session_id} الطريقة: ٪ l ٪ n ٪ m ٪ nlog4j.appender.file.buffersize = 10000log4j.appender.file.encoding = utf-8 log4j.logger.net.czt.crazyant.msg = debug ، messagelog4j.additivity.net.czt.crazyant.msg = falselog4j.appender.message = org.apache.log4j.rollingfileAppenderlog4j.appender.message.file =/home/work/apache-tomcat-6.0.0.39/logs Age.Append = truelog4j.appender.message.maxfilesize = 1gblog4j.appender.message.maxbackupindex = 5log4j.appender.message.layout = org.apache.log4j.patternlayoutlog4j.appender.message.layout.conversionpattern = ٪ d HH: mm: ss} [٪ -5p] [٪ c {1}] [٪ t]-٪ m ٪ nlog4j.appender.message.encoding = utf-8 log4j.logger.net.czt.crazyant.async.service = debug ، asynclog4j.additivity.net.czt.crazyant.async.service = falselog4j.appender.async = org.apache.log4j.rollingfileappenderlog4j.appender.async.file =/home/apache-tomcat-6.0.39 r.async.append = truelog4j.appender.async.maxfilesize = 1gblog4j.appender.async.maxbackupIndex = 5log4j.appender.async.layout = org.apache.log4j.patternlayoutlog.Appender.Async.layout.conversial [٪ -5p] [٪ c {1}] [٪ t]-٪ m ٪ nlog4j.appender.async.encoding = utf-8 log4j.logger.net.czt.orm.mybatis.sqlmonitormanager = debug ، showsqllog4j.additivity.net.czt.orm.mybatis.sqlmonitormanager = falselog4j.logger.net.czt.transaction.Interceptor.SmartTransActionInterceptor = debug ، showsqllog4j.additivity.net.czt.transaction.Interceptor.SmartTransActionInterceptor = falselog4j.appender.showsql = org .apache.log4j.rollingfileappenderlog4j.appender.showsql.file =/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.logl OG4J.Appender.showsql.append = truelog4j.appender.showsql.maxfilesize = 1gblog4j.appender.showsql.maxbackupindex = 5log4j .appender.showsql.layout = org.apache.log4j.patternlayoutlog4j.appender.showsql.layout.conversionpattern = ٪ d {yyyy-mm-dd HH: mm: ss} [٪ -5p] [٪ c {1}] [٪ t]-٪ m ٪ nlog4j.appender.showsql.encoding = utf-8 log4j.logger.net.czt.crazyant.service = debug ، servicelog4j.additivity.net.czt.crazyant.service = falselog4j.appender.service = org.apache.log4j.rollingfileAppenderlog4j.appender.service.file =/home/work/apache-tomcat-6.0.39/logs rvice.append = truelog4j.appender.service.maxfilesize = 1gblog4j.appender.service.maxbackupindex = 5log4j.appender.service.layout = org.apache.log4j.patternlayoutlog4j.appender.service.layout.conversion HH: mm: ss} [٪ -5p] [٪ c {1}] [٪ t]-٪ m ٪ nlog4j.appender.service.encoding = utf-8أسفل ملف التكوين ، يمكنك بسهولة أن ترى أنني أخرج الرسالة (الرسالة) ، و ASYNC (مؤشر ترابط الخلفية) ، و showsql (سجل قاعدة البيانات) ، والخدمة (استدعاء الواجهة) إلى ملفات سجل مختلفة على التوالي.
بعض هذه التفسيرات:
log4j.rootLogger=INFO, console, file
Log4J لديه مفهوم Rootlogger والمسجل العادي. بشكل افتراضي ، نحتاج فقط إلى Rootlogger ، أي أن جميع السجلات لن يتم إخراجها إلا إلى ملف السجل هذا.
ألقِ نظرة على تكوين المسجل العادي (أخذ خدمة سجل الواجهة كمثال):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
يشير " net.czt.crazyant.service " في هذه الجملة إلى المسار الكامل للحزمة التي تثير سريانها في تكوين سجل المسجل العادي
تشير خدمة الألوان إلى اسم المسجل العادي
2. log4j.additivity.net.czt.crazyant.service=false
" net.czt.crazyant.service " هو نفسه كما سبق ، مما يشير إلى الحزمة المستهدفة بواسطة عنصر التكوين.
معنى التكوين في هذه الجملة هو عدم إخراج سجل الحزمة إلى سجل Rootlogger ، ولكن فقط إخراجه إلى السجل الذي قمت بتكوينه ؛
3. log4j.appender.service=org.apache.log4j.RollingFileAppender ، وعناصر التكوين أدناه هذا القسم التكوين هذا
سلسلة "الخدمة" هنا هي نفس "الخدمة" لعنصر التكوين الأول أعلاه ، مما يشير إلى تكوين المسجل العادي ؛
عناصر التكوين أدناه هي نفسها مثل Rootlogger ، مما يشير إلى ملف الإخراج كل يوم ، وترميز UTF8 ، وقواعد التقش ، ووضع الإخراج لكل سطر ، إلخ.
كانت المشكلة التي واجهتها هو أنه بعد تكوين log4j.properties أعلاه ، وجدت أنه تم إنشاء كل ملف سجل ، ولكن لم يكن هناك محتوى فيه. لماذا هذا؟ دعونا نلقي نظرة على الشيء الثاني الذي تولي اهتمامه أدناه ؛
الخطوة 2: عند إخراج السجل ، تحتاج إلى تعيين الفئة المحددة المقابلة لكائن السجل.
ماذا يعني ذلك؟ في عنصر التكوين أعلاه ، هناك سلسلة حزمة " net.czt.crazyant.service ". لذلك دعونا نفكر في الأمر بأنفسنا ، كيف يتم تسجيل تسجيلات سجلات الإخراج Log4J في حزم مختلفة إلى ملفات مختلفة؟ فكر في الأمر ، هناك طريقتان:
1. استخدم طريقة التعريف أو AOP ، يكتشف Log4J إخراج السجل بنفسه. عندما يكتشف الحزمة التي يتم إنشاء السجل ، سيتم إخراجها إلى الملف المقابل ؛
2. يقوم المستخدم بتمرير معلمة فئة ، يحصل Log4J على الحزمة المقابلة للفئة ، واستخدم هذا كأساس لتحديد موقع ملفات سجل مختلفة ؛
بالنظر إلى الكود ، من الواضح أن Log4J يستخدم الطريقة البسيطة والمباشرة الأخيرة:
استيراد org.apache.commons.logging.log ؛ استيراد org.apache.commons.logging.logfactory ؛ الفئة العامة myClassImpl تنفذ myClass { / ** * loger * / private static logger logger = logfactory.getLog (myClassImpl.Class) ؛ / ** * my func */ public void myfunc () {logger.info ("call method myfunc.") ؛ }} في logger = LogFactory.getLog(MyClassImpl.class) ، يتم تمرير معلمة الفئة باستخدام المسجل ، وعنوان الحزمة الذي ينعكس الفئة هو عنوان الحزمة المستخدمة بواسطة log4j لإخراج السجل.
يحتوي هذا النهج أيضًا على ميزات قوية ، مما يسهل تصنيف السجل المنطقي. على سبيل المثال ، لا تنتمي العديد من الرموز إلى حزمة ، لكنها تنتمي إلى معًا بشكل منطقي. على سبيل المثال ، فإن معالجة الرسائل ليست فقط الواجهة التي تستدعي حزمة الخدمة ، ولكن قد تتصل أيضًا بتشغيل إرسال MSG. إذا كنت ترغب في إخراج بعض السجلات في حزمة MSG إلى الخدمة ، فعندما تتم تهيئة مسجل MSG ، تكون فئة الخدمة على ما يرام.
أو بالنسبة لجميع سجلات فئة معينة ، يمكن أن تكون جميع كائنات المسجلات الخاصة بهم من مثيل كائن واحد مغلف ، وهناك معلمة واحدة فقط تم تمريرها في مثيل الكائن الواحد ، والتي يمكن استخدامها لتحديد هذا التصنيف المنطقي.
لخص
في Log4j.properties ، يتم دعم إخراج منفصل لسجلات الحزمة أو الفئة المحددة ، ولكنه يتطلب أيضًا أن يتوافق تهيئة المسجل في الكود مع الحزمة في تكوين السجل.
حسنًا ، ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون محتوى هذه المقالة من بعض المساعدة في دراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.