3.1 รายการระดับเหตุการณ์
การบันทึกเป็นกระบวนการบันทึกเหตุการณ์ใด ๆ ที่เกิดขึ้นในขณะที่โปรแกรมกำลังทำงาน หน้าที่ของคุณในฐานะโปรแกรมเมอร์คือrecord everything important
เมื่อproduction
มีข้อผิดพลาดแปลก ๆ และ / หรือร้ายแรง คุณจะไม่มีอะไรอื่นนอกจากบันทึกเหล่านี้
ข้อผิดพลาดใด ๆ จะถูกกำจัดเร็วขึ้นหลายเท่าหากคุณมีข้อมูลทั้งหมดเกี่ยวกับข้อผิดพลาดและประวัติการโทรทั้งหมด แต่ข้อสรุปง่ายๆ จากที่นี่ - เพื่อบันทึกทุกอย่างโดยทั่วไป: การเรียกใช้เมธอดทั้งหมด, ค่าของพารามิเตอร์ทั้งหมด
นี่ไม่ใช่ตัวเลือก - ข้อมูลที่มากเกินไปก็ไม่ดีพอๆ กับที่น้อยเกินไป เราต้องการการบันทึกที่ชาญฉลาด สร้างโดยมนุษย์เพื่อมนุษย์ และที่นี่เรามาถึงข้อเท็จจริงแรกเกี่ยวกับการบันทึก - รายการทั้งหมดในบันทึกจะถูกแบ่งออกเป็นหมวดหมู่แม้ในขณะที่สร้าง

โปรแกรมเมอร์เมื่อเขียนเหตุการณ์ลงในบันทึกต้องตัดสินใจด้วยตัวเองว่าข้อมูลนี้มีความสำคัญเพียงใด ผู้เขียนข้อความเป็นผู้เลือกระดับความรุนแรงของเหตุการณ์ log4j
ความสำคัญของข้อมูลที่บันทึกไว้มี 5 ระดับ:
DEBUG
INFO
WARN
ERROR
FATAL
ด้านล่างนี้เราจะบอกรายละเอียดเพิ่มเติมเกี่ยวกับพวกเขา
3.2 ดีบัก
ระดับDEBUG
ถือว่ามีความสำคัญน้อยที่สุด ข้อมูลที่เขียนลงในบันทึกด้วยระดับความสำคัญนี้จำเป็นระหว่างการดีบักแอปพลิเคชันเท่านั้น ในการบันทึกข้อมูลที่จำเป็นระหว่างการดีบัก จะใช้วิธีการdebug()
นี้
ตัวอย่าง:
class Manager {
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task) {
logger.debug("processTask id = " + task.getId());
try {
task.start();
task.progress();
task.complete();
return true;
} catch (Exception e) {
logger.error("Unknown error", e);
return false;
}
}
}
ให้ความสนใจเมธอดdebug
อยู่ที่จุดเริ่มต้นของเมธอด (เมธอดยังไม่มีเวลาทำอะไร) และเขียนค่าของตัวแปรที่ส่งผ่านไปยังเมธอดไปยังบันทึก นี่เป็นกรณีการใช้งานทั่วไปสำหรับวิธีการdebug()
นี้
3.3 ข้อมูลและคำเตือน
อีกสองระดับถัด ไป คือINFO
และ WARN
มีสองวิธีสำหรับพวกเขา - info()
และwarn()
.
ระดับนี้INFO
ใช้สำหรับข้อความที่ให้ข้อมูล: สิ่งนี้และที่เกิดขึ้น เมื่อคุณเริ่มแยกวิเคราะห์ข้อผิดพลาดในบันทึก การอ่านเบื้องหลังจะมีประโยชน์มาก วิธีนี้เหมาะสำหรับสิ่งinfo()
นี้
ระดับWARN
ที่ใช้ในการเขียนคำเตือน (จากคำว่าคำเตือน ) โดยปกติแล้ว ด้วยระดับความสำคัญนี้ ข้อมูลจะถูกเขียนขึ้นว่ามีบางอย่างผิดพลาด แต่โปรแกรมรู้ว่าต้องทำอย่างไรในสถานการณ์นี้
ตัวอย่างเช่น ในกระบวนการเขียนไฟล์ลงดิสก์ ปรากฎว่ามีไฟล์ดังกล่าวอยู่แล้ว ที่นี่โปรแกรมสามารถบันทึกคำเตือน (คำเตือน) แต่แสดงกล่องโต้ตอบและเสนอให้ผู้ใช้เลือกชื่อไฟล์อื่น
ตัวอย่าง:
class FileManager {
private static final Logger logger = LoggerFactory.getLogger(FileManager.class);
public boolean saveFile(FileData file) {
logger.info(“save the file ” + file.getName());
boolean resultOK = SaveUtils.save(file);
if (resultOK) return true;
logger.warn(“file writing problem ” + file.getName());
String filename = Dialog.selectFile();
boolean result = SaveUtils.save(file, filename);
return result;
}
3.4 ข้อผิดพลาดและร้ายแรง
สุดท้าย ระดับการบันทึกที่สำคัญที่สุดสองระดับคือERROR
และ FATAL
สำหรับพวกเขายังมีวิธีการพิเศษที่มีชื่อเหมือนกัน: error()
และfatal()
.
พวกเขายังตัดสินใจแบ่งข้อผิดพลาดออกเป็นสองประเภท ได้แก่ ข้อ ผิดพลาดทั่วไปและข้อผิดพลาดร้ายแรง ข้อผิดพลาดร้ายแรงมักส่งผลให้เกิดความผิดพลาดของแอปพลิเคชัน (สำหรับแอปพลิเคชันเดสก์ท็อป) หรือบริการเว็บขัดข้อง (สำหรับแอปพลิเคชันบนเว็บ)
อีกตัวอย่างที่ดีคือระบบปฏิบัติการ Windows หากโปรแกรมของคุณเพิ่งหยุดทำงาน จากมุมมองของระบบปฏิบัติการ นี่คือError
. และหากระบบปฏิบัติการล่มและคุณเห็นหน้าจอสีน้ำเงินแห่งความตายของ Windows แสดงว่าเป็นแล้วFatal error
.
ในแอปพลิเคชัน Java เหตุการณ์ มัก Error
จะFatal
เกี่ยวข้องกับข้อยกเว้นที่เพิ่มขึ้น ตัวอย่าง:
class Manager {
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task) {
logger.debug("processTask id = " + task.getId());
try {
task.start();
task.progress();
task.complete();
return true;
} catch (Exception e) {
logger.error("Unknown error", e);
return false;
}
}
}
3.5 สิ่งที่ต้องเข้าสู่ระบบ
แน่นอนว่ามันไม่คุ้มที่จะบันทึกทุกอย่างติดต่อกัน ในกรณีส่วนใหญ่ สิ่งนี้ทำให้ความสามารถในการอ่านบันทึกแย่ลงอย่างมาก และหลังจากนั้น บันทึกจะถูกเขียนขึ้นตั้งแต่แรกเพื่อที่จะอ่านได้
นอกจากนี้ คุณไม่สามารถเขียนข้อมูลส่วนบุคคลและข้อมูลทางการเงินต่าง ๆ ลงในบันทึกได้ ตอนนี้คุณสามารถถูกปรับหรือถูกฟ้องร้องอย่างเคร่งครัดและง่ายดาย ไม่ช้าก็เร็วบันทึกดังกล่าวจะรั่วไหลออกไปด้านข้างและจะไม่มีปัญหา
ดังนั้นสิ่งที่ควรเข้าสู่ระบบ?
ขั้นแรก คุณต้องบันทึกการเริ่มต้นแอปพลิเคชัน หลังจากที่แอปพลิเคชันเริ่มต้นขึ้น ขอแนะนำให้บันทึกโหมดการทำงานและการตั้งค่าที่สำคัญต่างๆ ซึ่งจะทำให้อ่านบันทึกได้ง่ายขึ้นในอนาคต
ประการที่สอง คุณต้องบันทึกสถานะของบริการของบุคคลที่สามทั้งหมดที่แอปพลิเคชันของคุณทำงานด้วย: ระบบการส่งจดหมาย บริการภายนอกใดๆ อย่างน้อยที่สุด คุณต้องรักษาช่วงเวลาของการเชื่อมต่อกับพวกเขาเพื่อให้แน่ใจว่าพวกเขาทำงานได้อย่างถูกต้อง
ประการที่สาม ต้องบันทึกข้อ ยกเว้นทั้งหมด หากคาดว่าจะสามารถเขียนข้อมูลให้กะทัดรัดได้ ข้อมูลที่ครบถ้วนเกี่ยวกับข้อยกเว้นจะให้ข้อมูลสำคัญ 50%-80% เมื่อค้นหาจุดบกพร่อง
คุณต้องบันทึกการปิดแอปพลิเคชันด้วย แอปพลิเคชันต้องยุติตามปกติและไม่ทิ้งข้อผิดพลาดมากมายลงในบันทึก บ่อยครั้งในสถานที่นี้ คุณจะพบงานที่ติดขัด ปัญหาเกี่ยวกับเธรดพูล หรือปัญหาเกี่ยวกับการลบไฟล์ชั่วคราว
อย่าลืมบันทึกทุกอย่างที่เกี่ยวข้องกับความปลอดภัยและการให้สิทธิ์ผู้ใช้ หากผู้ใช้พยายามเข้าสู่ระบบหรือรีเซ็ตรหัสผ่านติดต่อกัน 10 ครั้ง ข้อมูลนี้ควรจะแสดงในบันทึก
บันทึก ข้อมูลเกี่ยวกับงานแบบอะซิงโครนัสให้ได้มากที่สุด- ข้อยกเว้นมักจะหายไปในเธรดดังกล่าว สำหรับงานแบบอะซิงโครนัส ต้องแน่ใจว่าได้บันทึกจุดเริ่มต้นและจุดสิ้นสุด การดำเนินการที่สำเร็จควรเข้าสู่ระบบในลักษณะเดียวกับที่มีปัญหา
อะไรอีก? เรียกใช้งานที่กำหนดเวลา เรียกใช้งานที่เก็บไว้ ซิงSQL-procedures
โครไนซ์ข้อมูล ทุกอย่างที่เกี่ยวข้องกับธุรกรรมแบบกระจาย ฉันคิดว่ามันเพียงพอแล้วสำหรับการเริ่มต้น คุณจะเพิ่มในรายการนี้ในอนาคต