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โครไนซ์ข้อมูล ทุกอย่างที่เกี่ยวข้องกับธุรกรรมแบบกระจาย ฉันคิดว่ามันเพียงพอแล้วสำหรับการเริ่มต้น คุณจะเพิ่มในรายการนี้ในอนาคต