ฉันต้องการใช้บันทึกในโปรแกรมของฉัน ฉันได้ยินเกี่ยวกับjava.util.loggingแต่ฉันไม่รู้ว่าจะเริ่มอย่างไร
มีตัวอย่างของสิ่งที่ฉันจะทำอย่างไรกับการเข้าสู่ระบบ? ฉันจะใช้การบันทึกในโปรแกรมของตัวเองได้อย่างไร
ฉันต้องการใช้บันทึกในโปรแกรมของฉัน ฉันได้ยินเกี่ยวกับjava.util.loggingแต่ฉันไม่รู้ว่าจะเริ่มอย่างไร
มีตัวอย่างของสิ่งที่ฉันจะทำอย่างไรกับการเข้าสู่ระบบ? ฉันจะใช้การบันทึกในโปรแกรมของตัวเองได้อย่างไร
คำตอบ:
java.util.logging
ช่วยให้คุณไม่ต้องผูกไฟล์ jar อีกรอบด้วยแอปพลิเคชันของคุณและทำงานได้ดีกับฟอร์แมตเตอร์ที่ดี
โดยทั่วไปที่ด้านบนของทุกชั้นเรียนคุณควรจะมี:
private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );
จากนั้นคุณสามารถใช้สิ่งอำนวยความสะดวกต่าง ๆ ของคลาสLogger
ใช้Level.FINE
สำหรับทุกสิ่งที่ดีบั๊กที่ระดับสูงสุดของโฟลว์การดำเนินการ:
LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );
ใช้Level.FINER
/ Level.FINEST
ภายในของลูปและในสถานที่ที่คุณอาจไม่จำเป็นต้องเห็นรายละเอียดมากนักเมื่อทำการดีบั๊กปัญหาการไหลพื้นฐาน:
LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );
ใช้เวอร์ชันที่ทำพารามิเตอร์ของสิ่งอำนวยความสะดวกการบันทึกเพื่อป้องกันมิให้เกิดการสร้างการรวมสตริงแบบตันที่ GC จะต้องติดตาม Object[]
เนื่องจากด้านบนมีราคาถูกในการจัดสรรสแต็กมักจะ
ด้วยการจัดการข้อยกเว้นให้บันทึกรายละเอียดข้อยกเว้นทั้งหมด:
try {
...something that can throw an ignorable exception
} catch( Exception ex ) {
LOGGER.log( Level.SEVERE, ex.toString(), ex );
}
ฉันมักจะส่งผ่านex.toString()
ข้อความที่นี่เพราะเมื่อฉัน " grep -n
" สำหรับ " Exception
" ในไฟล์บันทึกฉันก็สามารถเห็นข้อความได้เช่นกัน ไม่เช่นนั้นจะเกิดขึ้นในบรรทัดถัดไปของเอาต์พุตที่สร้างโดยสแต็กดัมพ์และคุณต้องมี RegEx ขั้นสูงเพื่อจับคู่บรรทัดนั้นด้วยซึ่งมักทำให้คุณได้รับเอาต์พุตมากกว่าที่คุณต้องมองผ่าน
.fine()
วิธีการในการเข้าสู่ระบบ แต่ฉันไม่สามารถดูเหมือนจะทำให้ข้อความแสดง ...
ควรประกาศคนตัดไม้เช่นนี้:
private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
ดังนั้นหากคุณปรับโครงสร้างชื่อชั้นของคุณใหม่
มีตัวอย่างมากมายและประเภทต่าง ๆ สำหรับการบันทึก ดูแพ็คเกจjava.util.logging
รหัสตัวอย่าง:
import java.util.logging.Logger;
public class Main {
private static Logger LOGGER = Logger.getLogger("InfoLogging");
public static void main(String[] args) {
LOGGER.info("Logging an INFO-level message");
}
}
ไม่มีการเข้ารหัสฮาร์ดคลาสชื่อ :
import java.util.logging.Logger;
public class Main {
private static final Logger LOGGER = Logger.getLogger(
Thread.currentThread().getStackTrace()[0].getClassName() );
public static void main(String[] args) {
LOGGER.info("Logging an INFO-level message");
}
}
Main.class.getSimpleName()
? เครื่องมือเปลี่ยนทางด้วยวิธีนี้จะเปลี่ยนแปลงได้อย่างถูกต้องหากจำเป็นและยังไม่เป็นวิธีแก้ปัญหาที่สองของคุณ
SLF4J เป็นส่วนการบันทึกที่ดีกว่า Apache Commons Logging (ACL) มีบริดจ์ไปยังเฟรมเวิร์กการบันทึกอื่น ๆ การโทรโดยตรงไปยัง ACL, Log4J หรือ Java Util Logging ผ่าน SLF4J เพื่อให้คุณสามารถส่งเอาต์พุตทั้งหมดไปยังไฟล์บันทึกไฟล์เดียวหากคุณต้องการโดยมีไฟล์กำหนดค่าบันทึกไฟล์เพียงไฟล์เดียว เหตุใดแอปพลิเคชันของคุณจะใช้เฟรมเวิร์กการบันทึกหลายเฟรม เนื่องจากห้องสมุดบุคคลที่สามที่คุณใช้โดยเฉพาะอย่างยิ่งห้องสมุดที่เก่ากว่า
SLF4J รองรับการใช้งานการบันทึกที่หลากหลาย มันสามารถส่งออกทุกอย่างเพื่อออกมาตรฐานใช้ Log4J หรือ Logback (แนะนำมากกว่า Log4J)
ฉันขอแนะนำให้คุณใช้ยูทิลิตี้การเข้าสู่ระบบของ Apache สามารถปรับขนาดได้สูงและรองรับไฟล์บันทึกแยกต่างหากสำหรับตัวบันทึกที่แตกต่างกัน ดูที่นี่