أثناء تشغيل المشروع ، غالبًا ما يكون من الضروري تنفيذ تصحيح الأخطاء الوظيفية وتتبع وتسجيل سلوك المستخدم. يعتاد بعض الأشخاص على استخدام system.out ، ولكن لا ينصح بذلك. من السهل الاستخدام فقط ولكن ليس من السهل الحفاظ عليه وليس له قابلية التوسع. بالمقارنة مع Log4J ، يمكن لـ Log4J التحكم في الوجهة وتنسيق الإخراج ومستوى معلومات السجل ، وما إلى ذلك ، بحيث يمكننا التحكم في عملية توليد السجل بعناية أكبر.
Log4J2 هي ترقية إلى Log4J1 ، مع تحسينات كبيرة في الأداء والوظائف ، بما في ذلك الإنتاجية المحسنة في Multithreads ، ودعم العناصر النائبة ، وإعادة تحميل ملفات التكوين التلقائي ، إلخ.
1. مقدمة
1. قم بتنزيل حزمة الجرة
pox.xml
<ependencies> <Rependency> <roupiD> org.apache.logging.log4j </rougiD> <StifactId> log4j-api </shintifactid> <sophy> 2.10.0 </splement> </respency> <sperence> <roupaD> org.apache.logging.log4j </groupid> <sophy> 2.10.0 </version> </sependency> </perendencies>
2. ملف التكوين
يحتوي LOG4J على أربعة تطبيقات مصنع للتكوين: JSON ، YAML ، الخصائص ، و XML. تقدم هذه المقالة الطريقة الشائعة الاستخدام XML.
يتمتع Log4J بالقدرة على تكوين نفسه تلقائيًا أثناء التهيئة. عند بدء تشغيل log4j ، ستحدد جميع الملفات المتوافقة مع الأسماء ضمن classpath ، مع ترتيب الأولوية: log4j2-test.properties> log4j2-test.xml> log4j2.properties> log4j2.xml
3. مثال بسيط
تكوين XML:
<؟ <GOGGERS> <ROOT LEVEL = "Info"> <appenderRef Ref = "Console"/> </route> </loggers> </isplicuration>
كود جافا:
private Static Final Logger Logger = logManager.getLogger (myapp.class) ؛ Test public void testlog4j () {logger.info ("Hello World!") ؛ }}معلومات وحدة التحكم
22: 17: 47.146 [Main] Info MyApp - Hello World!
2. وحدة مقدمة
<simpion>
| ملكية | يصف |
| MonitorInterval | إذا تم تعديل الملف ، فسيتم إعادة تحميل التكوين بعد الوقت المحدد. وحدات الثواني ، الحد الأدنى القيمة هو 5 |
| حزم | قائمة مفصولة بفواصل من أسماء الحزم المستخدمة للبحث عن المكونات الإضافية ، مثل المرشحات المخصصة والملاحق ، إلخ |
| حالة | يمكن لمستوى السجل الداخلي ، وضع القيمة للتصحيح أن يرى بوضوح تدفق حدث السجل بالكامل على وحدة التحكم. المسجل المستخدم هو org.apache.logging.log4j.core.logger |
| حازم | يسمح بتنسيق XML صارم. تكوين JSON غير مدعوم |
| مطول | تمكين المعلومات التشخيصية عند تحميل البرنامج المساعد |
<الملحق>
يتيح Log4J طباعة طلبات السجل إلى وجهات متعددة. في لغة log4j ، تسمى وجهة الإخراج Appender. حاليًا ، توجد الملاحق في لوحات المفاتيح ، والملفات ، وخوادم المقبس عن بعد ، و Apache Flume ، و JMS ، و Daemons Unix Syslog البعيد ومختلف واجهات برمجة التطبيقات لقواعد البيانات. يقدم ما يلي العديد من الملاحق أكثر شيوعًا. إذا كنت بحاجة إلى معرفة المزيد ، فيمكنك التحقق من ذلك على الموقع الرسمي.
1
الإخراج إلى وحدة التحكم ، <console>
اسم المعلمة | يكتب | يصف |
فلتر | فلتر | فلتر |
تَخطِيط | تَخطِيط | تنسيق إخراج السجل |
يتبع | منطقية | |
مباشر | منطقية | |
اسم | خيط | اسم الزائدة |
تجاهل | منطقية | صواب افتراضي ، تجاهل استثناءات الكتابة |
هدف | خيط | System_out أو system_err ، الافتراضي هو system_out |
2
الإخراج للملف ، <file>
المعلمة | يكتب | يصف |
|---|---|---|
إلحاق | منطقية | الافتراضي صحيح ، وسيتم إلحاق سجلات جديدة حتى نهاية الملف |
المخزن المؤقت | منطقية | الافتراضي صحيح ، يمكن أن يؤدي استخدام المخازن المؤقتة إلى تحسين الأداء بشكل كبير |
تقوية | int | عندما يكون Bufferedio صحيحًا ، يكون حجم المخزن المؤقت لهذه الخاصية 8192 بايت افتراضيًا. |
CreateOndemand | منطقية | الجذاب ينشئ الملفات عند الطلب. لن يقوم Appender بإنشاء هذا الملف إلا عندما يمر حدث السجل عبر جميع المرشحات ويتم توجيهه إلى الجسد. القيمة الافتراضية خاطئة |
فلتر | فلتر | مرشح لتحديد ما إذا كان ينبغي التعامل مع الحدث من قبل هذا الجهد. يمكن استخدام مرشحات متعددة مع المرشحات المركبة |
اسم الملف | خيط | اسم الملف المراد كتابته. إذا لم يكن الملف أو أي من أدلة الأمه غير موجود ، فسيتم إنشاءها |
فوري | منطقية | بشكل افتراضي ، سيكون هناك تحديث بعد كل كتابة. سيضمن ذلك كتابة بيانات المخزن المؤقت إلى القرص ، ولكن قد يؤثر على الأداء. |
تَخطِيط | تَخطِيط | تنسيق السجل |
قفل | منطقية | قفل الملف ، الافتراضي خطأ |
اسم | خيط | اسم الزائدة |
تجاهل | منطقية | صواب افتراضي ، تجاهل استثناءات الكتابة |
filepermissions | خيط | تحديد أذونات الملف مثال: RW ------ أو RW-RW-RW- إلخ ... |
FileOwner | خيط | تحديد مالك الملف |
FileGroup | خيط | تحديد مجموعات الملفات |
3. jdbcaappender
يستخدم JDBCappender JDBC قياسي لكتابة أحداث السجل في جداول قاعدة البيانات العلائقية. يمكن تكوينه للحصول على اتصال JDBC باستخدام مصدر بيانات JNDI أو طريقة مصنع مخصصة. بغض النظر عن هذه الطريقة ، يجب دعمها بواسطة مجموعة الاتصال.
خلاف ذلك ، سوف يتأثر أداء التسجيل بشكل كبير.
إذا كان برنامج تشغيل JDBC الذي تم تكوينه يدعم عبارات الدُفعات وتكوين حجم المخزن المؤقت إلى رقم إيجابي ، فسيتم تجميع حدث السجل.
(1) <JDBC>
المعلمة | يكتب | يصف |
|---|---|---|
اسم | خيط | يجب ، اسم الملحق |
تجاهل | منطقية | صواب افتراضي ، تجاهل استثناءات حدث السجل |
فلتر | فلتر | فلتر |
تقوية | int | إذا كان عدد صحيح أكبر من 0 ، فإن هذا سيؤدي إلى تخزين Appender لحدث السجل وتحديث بيانات الكتابة عندما يصل المخزن المؤقت إلى هذا الحجم |
Connectionource | Connectionource | يجب استرداد اتصال قاعدة البيانات |
اسم TableName | خيط | مطلوب ، أدخل اسم جدول البيانات لحدث السجل |
ColumnConfigs | ColumnConfig [] | يجب أن تكون الحقول التي تحتاج إلى إدراج في قاعدة البيانات مكونة من عناصر <العمود> متعددة |
ColumnMappings | ColumnMapping [] | مطلوب ، تكوين تعيين الحقل |
(2) استخدم <TaSaSource> للحصول على اتصال JDBC ، يتم سرد JNDI فقط هنا:
| المعلمة | يكتب | يصف |
|---|---|---|
| jndiname | خيط | مطلوب ، إذا كانت JNDI التي تم تكوينها هي JDBC/LoggingDatabase ، فإن القيمة هنا هي Java: Comp/Env/JDBC/LoggingDatabase. يجب دعم مصدر البيانات بواسطة تجمع الاتصال ؛ خلاف ذلك ، سيكون قطع الأشجار بطيئة للغاية. |
(3) استخدم <bolumn> لتحديد الأعمدة التي يجب الكتابة على الجدول وكيفية كتابتها. ليس لديها ثغرة حقن SQL.
| المعلمة | يكتب | يصف |
|---|---|---|
| اسم | خيط | مطلوب ، اسم حقل الجدول |
| نمط | خيط | أدخل القيم باستخدام وضع PatternLayout. ملاحظة: في نفس عنصر العمود ، يمكن أن توجد واحدة فقط من السمات الثلاث للأنماط والحرفية و iseventtimestamp في نفس عنصر العمود. |
| حرفي | خيط | سيتم تضمين هذه القيمة مباشرة في عبارة SQL وتنفيذها ، على سبيل المثال: ستنشئ وظيفة Rand () أرقامًا عشوائية ، على غرار $ {} في myibats |
| iseventtimestamp | منطقية | ما إذا كان تنسيق الوقت java.sql.types.timestamp |
| isUnicode | منطقية | يتم تجاهل هذه الخاصية ما لم يتم تحديد نمط. إذا كان ذلك صحيحًا ، فسيتم إدراج القيمة في Unicode. خلاف ذلك ، سيتم إدراج القيمة في غير uniCode. |
| ISCLOB | منطقية | يتم تجاهل هذه الخاصية ما لم يتم تحديد نمط. إذا كان ذلك صحيحًا ، فسيتم إدراج القيمة في CLOB ، وإلا فإن Varchar ، سيتم إدراج NvarChar في |
مثال:
<؟ isEventTimestamp = "true" /> <column name = "level" pattern = "٪ level" /> <column name = "logger" pattern = "٪ logger" /> <column name = "message" pattern = "٪ message" /> <column name = "stispate" = "٪ ex {full}" /> Ref = "DatabaseAppender"/> </rout> </loggers> </ispicturation><TugmentLayout>
(1) التاريخ ، ٪ د/٪ تاريخ
نمط | مثال |
|---|---|
٪ d {default} | 2012-11-02 14: 34: 02،781 |
٪ d {iso8601} | 2012-11-02T14: 34: 02،781 |
٪ d {iso8601_basic} | 20121102T143402،781 |
٪ d | 14: 34: 02781 |
٪ d {date} | 02 نوفمبر 2012 14: 34: 02،781 |
٪ d {compact} | 20121102143402781 |
٪ d {hh: mm: ss ، ss} | 14: 34: 02781 |
٪ d {dd mmm yyy hh: mm: ss ، ss} | 02 نوفمبر 2012 14: 34: 02،781 |
٪ d {hh: mm: ss} {gmt+0} | 18:34:02 |
٪ d {unix} | 1351866842 |
٪ d {unix_millis} | 1351866842781 |
بالطبع يمكنك أيضًا تخصيص التنسيق ، مثل ٪ d {yyyy-mm-dd hh: mm: ss}
(2) المسجل ، ٪ ج/٪ المسجل
نمط التحويل | اسم المسجل | نتيجة |
|---|---|---|
٪ c {1} | org.apache.commons.foo | فو |
٪ c {2} | org.apache.commons.foo | المشاعات |
٪ c {10} | org.apache.commons.foo | org.apache.commons.foo |
٪ C {-1} | org.apache.commons.foo | Apache.Commons.foo |
٪ C {-2} | org.apache.commons.foo | المشاعات |
٪ C {-10} | org.apache.commons.foo | org.apache.commons.foo |
٪ c {1.} | org.apache.commons.foo | oacfoo |
٪ c {1.1. ~. ~} | org.apache.commons.test.foo | الزراعة العضوية ~. ~ .foo |
٪ c {.} | org.apache.commons.test.foo | .... فو |
{؟} - متى ؟ هو عدد صحيح إيجابي ، فهذا يعني أن الأجزاء n مأخوذة من اليمين ، وأن عدد صحيح سلبي يعني أن الأجزاء n تتم إزالة الأجزاء من اليسار. فلماذا ٪ C {-10} هو الاسم الكامل ، لا أعرف. مرحبًا بك في ترك رسالة
(3) تسجيل معلومات ، ٪ m/٪ msg/٪ رسالة
(4) مستوى السجل ، مستوى ٪
<filter>
يأتي Log4J2 مع مجموعة متنوعة من المرشحات للاستخدام المباشر ، ويمكننا أيضًا تحديد المرشحات بأنفسنا:
myfilter.java
استيراد org.apache.logging.log4j.level ؛ استيراد org.apache.logging.log4j.marker ؛ استيراد org.apache.logging.log4j.threadContext org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.config.plugins.pluginfactory org.apache.logging.log4j.message.message ؛ plugin (name = "myfilter" ، الفئة = "core" ، elementType = "filter" ، printObject = true) الفئة النهائية العامة myfilter يمتد الملخص {المستوى النهائي الخاص ؛ myfilter الخاص (مستوى المستوى ، النتيجة onMatch ، النتائج onMismatch) {super (onMatch ، onMismatch) ؛ this.vel = المستوى ؛ } مرشح النتيجة العامة (مسجل المسجل ، مستوى المستوى ، علامة العلامات ، السلسلة MSG ، Object [] params) {return filter (level) ؛ } مرشح النتائج العامة (مسجل المسجل ، مستوى المستوى ، علامة العلامات ، كائن MSG ، رمي t) {return filter (level) ؛ } مرشح النتيجة العامة (مسجل المسجل ، مستوى المستوى ، علامة العلامات ، رسالة MSG ، رمي t) {return filter (level) ؛ } Override Public Result Filter (Logevent Event) {return filter (event.getlevel ()) ؛ } مرشح النتيجة الخاصة (مستوى المستوى) { / * * منطق الأعمال * * / إرجاع مستوى. OnMatch: onMismatch ؛ } Override public string toString () {return level.toString () ؛ } pluginfactory static static myfilter createfilter (pluginattribute (value = "level" ، defaultString = "ERROR") مستوى مستوى ، pluginattribut myfilter (المستوى ، onMatch ، onMismatch) ؛ }}log4j2.xml
<؟ HH: MM: SS} ٪ Level ٪ logger {10} - ٪ msg "/> <myfilter level =" info "onMatch =" Accept "/> </sonsole> </espenders> <loggers> <root level =" info "> <appenderRef ref =" console "/> </root> </loggers>التجديد:
في التطبيقات العملية ، من الضروري في بعض الأحيان تسجيل معلومات وصول المستخدم ، مثل معلمات الطلب ومعرف المستخدم ، وما إلى ذلك في Log4J1 ، سنستخدم MDC و NDC لتخزين معلومات سياق التطبيق ، بينما يستخدم Log4J2 ThreadContext لتنفيذ وظائف كل من MDC و NDC.
(1) تستخدم NDC آلية تشبه المكدس لتخزين معلومات السياق ، والمواضيع مستقلة.
استخدم ٪ X للإخراج في PatternLayout ، لاحظ أن X صغير.
مثال:
test.java
ThreadContext.push ("Hello World!") ؛log4j2.xml
<column name = "tip" pattern = "٪ x" />
(2) تستخدم MDC آلية تشبه الخريطة لتخزين المعلومات ، والمواضيع مستقلة.
استخدم ٪ x {userId} في patternlayout للإخراج ، لاحظ أن x يتم رسملة.
مثال:
test.java
ThreadContext.put ("userId" ، "1") ؛log4j2.xml
<column name = "userid" pattern = "٪ x {userid}" />لاحظ أنه بعد استخدامه ، اتصل بـ clearall () لمسح خريطة السياق والمكدس.
API: http://logging.apache.org/log4j/2.x/javadoc.html
عنوان الموقع الرسمي: https://logging.apache.org/log4j/2.x/index.html
رمز المثال أعلاه لمكون سجل مشروع LOG4J2 هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.