היום נבחן את Logger ב-Java. ספריית ה-Logger של Java מספקת התעדפות בתכנות ב-Java.
Logger ב-Java
Java Logging הובאה לשימוש בגרסה 1.4 וניתן להשתמש ב- API של Java Logging כדי להתעד ברמות שונות באפליקציות. במדריך הזה נלמד את התכונות הבסיסיות של Logger ב-Java. נבחן גם דוגמאות של Logger ב-Java עם רמות שונות של התעד, מנהלי התעד, תצורות, מסננים, Log Manager והגדרות התעד.
Logger ב-Java
java.util.logging.Logger
הוא המחלקה המשמשת להתעד באפליקציות ב-API של Java Logging. ניתן ליצור Logger ב-Java באמצעות שורת קוד פשוטה מאוד כמו כן:
Logger logger = Logger.getLogger(MyClass.class.getName());
רמות התעד ב-Java
java.util.logging.Level
מגדיר את הרמות השונות של הלוג של Java. יש שבע רמות של לוגינג ב-Java.
- SEVERE (הכי גבוהה)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
ישנם שתי רמות לוג נוספות, OFF שתכבה את כל הלוגים ו־ALL שירשום את כל ההודעות. ניתן להגדיר את רמת הלוגר באמצעות הקוד הבא:
logger.setLevel(Level.FINE);
הלוגים ייווצרו עבור כל הרמות שהן שוות או גבוהות מהרמה של הלוגר. לדוגמה, אם רמת הלוגר מוגדרת כ־INFO, הלוגים ייווצרו עבור הודעות לוג ברמות INFO, WARNING ו־SEVERE.
טפסים של רשומות ב-Java
ניתן להוסיף מספר טיפולים ללוגר של Java וכאשר אנו רשומים הודעה כלשהי, כל טיפול יעבד אותה בהתאם. ישנם שני טיפולים ברירת מחדל שמסופקים על ידי API לוגינג של Java.
- ConsoleHandler: טיפול זה מכתיב את כל הודעות הלוג לקונסולה
- FileHandler: טיפול זה מכתיב את כל הודעות הלוג לקובץ בתצורת XML.
נוכל ליצור גם עצמנו טיפולים מותאמים אישית כדי לבצע משימות מסוימות. כדי ליצור את מחלקת המטפל האישית שלנו, נצטרך להרחיב את מחלקת java.util.logging.Handler או אחת מכיתותיה כמו StreamHandler, SocketHandler וכו '. הנה דוגמה לטיפול מותאם אישית בג'אווה לוגינג:
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
מעצבים משמשים לעיצוב של הודעות הרישום. ישנם שני מעצבים זמינים ב- API של רישום ב-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"));
הנה דוגמה לקובץ התצורה של ממשק ה- API של Java Logging. אם לא ציינו תצורה מסוימת, היא נקראת מתוך הקובץ lib/logging.properties
שבתיקיית הבית של JRE.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
הנה תכנית Java פשוטה המראה שימוש ב-Logger ב-Java.
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 {
// FileHandler שם קובץ עם הגבלת גודל ומספר הקבצים הלוגים
Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
fileHandler.setFormatter(new MyFormatter());
// הגדרת מסנן מותאם אישית עבור FileHandler
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();
}
}
}
כאשר תריצו את תכנית דוגמת הלוגר ב-Java שלמעלה, תשימו לב שהלוג 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
אם לא נוסיף מחלקת פורמטר משלנו ל-FileHandler, ההודעה בלוג תודפס כך.
<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
תמונה למטה מציגה את פרויקט דוגמת הלוגר ב-Java הסופי. זו הכול בנוגע ל-Logger ב-Java ולדוגמת הלוגר ב-Java. ניתן להוריד את הפרויקט מהקישור למטה.
הורד דוגמת פרויקט Logger של Java
הפניה: ממשק התכנות Java Logging
Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example