اليوم سنتطلع على Logger في Java. توفر Java Logger السجل في برمجة Java.
Logger في Java
واجهة برمجة التطبيقات للسجلات في Java تم إدخال API في الإصدار 1.4 ويمكنك استخدام Java Logging API لتسجيل رسائل التطبيق. في هذا البرنامج التعليمي لتسجيل Java، سنتعلم الميزات الأساسية لـ Java Logger. سنلقي أيضًا نظرة على مثال Java Logger لمستويات التسجيل المختلفة، ومعالجات التسجيل، ومنسقات التسجيل، ومرشحات التسجيل، ومدير السجلات وتكوينات التسجيل.
Java Logger
java.util.logging.Logger
هو الفئة المستخدمة لتسجيل رسائل التطبيق في Java Logging API. يمكننا إنشاء Java Logger بكود بسيط جدًا في سطر واحد؛
Logger logger = Logger.getLogger(MyClass.class.getName());
مستويات تسجيل Java
java.util.logging.Level
تعرّف المستويات المختلفة لتسجيل الأحداث في جافا. هناك سبعة مستويات لتسجيل الأحداث في جافا.
- SEVERE (الأعلى)
- تحذير
- معلومات
- تكوين
- دقيق
- أدق
- أدق فقط
هناك مستويين آخرين لتسجيل الأحداث، إيقاف الذي يعطل كل التسجيل و الكل الذي يسجل جميع الرسائل. يمكننا تعيين مستوى السجل باستخدام الكود التالي:
logger.setLevel(Level.FINE);
سيتم إنشاء السجلات لجميع المستويات التي تكون أكبر من أو تساوي مستوى السجل. على سبيل المثال، إذا تم تعيين مستوى السجل على مستوى معلومات، سيتم إنشاء السجلات لرسائل تسجيل مستويات معلومات، تحذير وSEVERE.
معالجات تسجيل جافا
يمكننا إضافة عدة معالجات إلى سجل جافا وعند تسجيل أي رسالة، ستقوم كل معالج بمعالجتها وفقًا لذلك. هناك معالجين افتراضيين يوفرهما واجهة برمجة تطبيقات تسجيل جافا.
- ConsoleHandler: يكتب هذا المعالج جميع رسائل التسجيل إلى وحدة التحكم
- FileHandler: يكتب هذا المعالج جميع رسائل التسجيل إلى ملف بتنسيق XML.
يمكننا إنشاء معالجات مخصصة خاصة أيضًا لأداء مهام محددة. لإنشاء فئة معالج مخصصة خاصة بنا، نحتاج إلى تمديد فئة java.util.logging.Handler أو أي من فئاتها الفرعية مثل StreamHandler و SocketHandler وما إلى ذلك. فيما يلي مثال على معالج تسجيل Java مخصص:
package com.journaldev.log;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
public class MyHandler extends StreamHandler {
@Override
public void publish(LogRecord record) {
// إضافة منطق مخصص للنشر
super.publish(record);
}
@Override
public void flush() {
super.flush();
}
@Override
public void close() throws SecurityException {
super.close();
}
}
مُعَيِّنات تنسيق سجلات Java
يُستخدم المُعَيِّنات لتنسيق رسائل السجلات. هناك مُعَيِّنتان متاحتان في واجهة برمجة تطبيقات تسجيل Java.
- SimpleFormatter: يُنشئ هذا المُعَيِّن نصوصًا مع معلومات أساسية. تستخدم ConsoleHandler فئة هذا المُعَيِّن لطباعة رسائل السجلات إلى وحدة التحكم.
- XMLFormatter: يُنشئ هذا المُعَيِّن رسالة XML للسجل، يستخدم FileHandler XMLFormatter كمُعَيِّن تنسيق افتراضي.
يمكننا إنشاء فئة مُعَيِّن تنسيق مخصصة خاصة بنا عن طريق تمديد فئة java.util.logging.Formatter
وتعلقيها بأي من المعالجات. فيما يلي مثال على فئة مُعَيِّن تنسيق مخصصة بسيطة.
package com.journaldev.log;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class MyFormatter extends Formatter {
@Override
public String format(LogRecord record) {
return record.getThreadID()+"::"+record.getSourceClassName()+"::"
+record.getSourceMethodName()+"::"
+new Date(record.getMillis())+"::"
+record.getMessage()+"\n";
}
}
سجل Java – مدير السجلات في Java
java.util.logging.LogManager
هو الفئة التي تقرأ تكوين تسجيل الأحداث، وتنشئ وتحافظ على مثيلات المسجل. يمكننا استخدام هذه الفئة لتعيين تكوين خاص بتطبيقنا.
LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
إليك مثال على ملف تكوين واجهة برمجة تطبيقات تسجيل الأحداث في جافا. إذا لم نحدد أي تكوين، فسيتم قراءته من ملف lib/logging.properties
في المجلد الرئيسي لتثبيت جافا.mylogging.properties
handlers= java.util.logging.ConsoleHandler
.level= FINE
# المخرج الافتراضي للملفات هو مجلد المستخدم الرئيسي.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# حدود الرسائل التي يتم طباعتها على وحدة التحكم هي INFO وما فوق.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.journaldev.files = SEVERE
إليك برنامج جافا بسيط يوضح استخدام مسجل الأحداث في جافا.
package com.journaldev.log;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class LoggingExample {
static Logger logger = Logger.getLogger(LoggingExample.class.getName());
public static void main(String[] args) {
try {
LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
} catch (SecurityException | IOException e1) {
e1.printStackTrace();
}
logger.setLevel(Level.FINE);
logger.addHandler(new ConsoleHandler());
// إضافة معالج مخصص
logger.addHandler(new MyHandler());
try {
// اسم معالج الملف مع الحد الأقصى لحجم الملف وحدود عدد ملفات السجل
Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
fileHandler.setFormatter(new MyFormatter());
// تعيين عامل تصفية مخصص لمعالج الملف
fileHandler.setFilter(new MyFilter());
logger.addHandler(fileHandler);
for(int i=0; i<1000; i++){
// رسائل تسجيل
logger.log(Level.INFO, "Msg"+i);
}
logger.log(Level.CONFIG, "Config data");
} catch (SecurityException | IOException e) {
e.printStackTrace();
}
}
}
عند تشغيل برنامج مثال مسجل جافا أعلاه، ستلاحظ أن سجل CONFIG لا يتم طباعته في الملف، وذلك بسبب فئة MyFilter.
package com.journaldev.log;
import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
public class MyFilter implements Filter {
@Override
public boolean isLoggable(LogRecord log) {
// لا تسجل سجلات CONFIG في الملف
if(log.getLevel() == Level.CONFIG) return false;
return true;
}
}
كما سيكون تنسيق الإخراج نفسه كما هو محدد بواسطة فئة MyFormatter.
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980
إذا لم نضيف فئة تنسيق خاصة لمعالج الملف، سيتم طباعة رسالة السجل بهذا الشكل.
<record>
<date>2012-12-14T17:03:13</date>
<millis>1355533393319</millis>
<sequence>996</sequence>
<logger>com.journaldev.log.LoggingExample</logger>
<level>INFO</level>
<class>com.journaldev.log.LoggingExample</class>
<method>main</method>
<thread>1</thread>
<message>Msg996</message>
</record>
رسائل سجل وحدة التحكم ستكون بهذا التنسيق:
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg997
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
الصورة أدناه تُظهر مشروع مثال نهائي لمسجل جافا. هذا كل شيء بالنسبة لمسجل الأحداث في جافا ومثال مسجل جافا. يمكنك تنزيل المشروع من الرابط أدناه.
Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example