1.1 รู้เบื้องต้นเกี่ยวกับบันทึก

บันทึกคือรายการเหตุการณ์ที่เกิดขึ้น เกือบจะเหมือนบันทึกการเดินเรือหรือไดอารี่ ดังนั้นคนตัดไม้ จึง เป็นวัตถุที่คุณสามารถบันทึกได้ ในการเขียนโปรแกรมเป็นเรื่องปกติที่จะต้องบันทึกเกือบทุกอย่าง และใน Java ทุกอย่างเป็นเช่นนั้นและมากกว่านั้นอีกเล็กน้อย

คนตัดไม้จาวา

ความจริงก็คือโปรแกรม Java มักเป็นแอปพลิเคชันเซิร์ฟเวอร์ขนาดใหญ่ที่ไม่มี UI คอนโซล และอื่นๆ พวกเขาประมวลผลคำขอจากผู้ใช้หลายพันคนพร้อมๆ กัน และมักเกิดข้อผิดพลาดต่างๆ โดยเฉพาะอย่างยิ่งเมื่อเธรดต่าง ๆ เริ่มรบกวนซึ่งกันและกัน

และในความเป็นจริงวิธีเดียวที่จะค้นหาข้อผิดพลาดและความล้มเหลวที่เกิดขึ้นได้ยากในสถานการณ์เช่นนี้คือการ เขียนทุกอย่าง ที่เกิดขึ้นในแต่ละเธรดลงในบันทึก / ไฟล์

บ่อยครั้งที่ข้อมูลถูกเขียนลงในบันทึกเกี่ยวกับพารามิเตอร์ของวิธีการที่เรียกใช้ ข้อผิดพลาดที่สกัดกั้นทั้งหมด และข้อมูลระดับกลางจำนวนมาก ยิ่งบันทึกสมบูรณ์มากเท่าใด ก็ยิ่งง่ายต่อการกู้คืนลำดับเหตุการณ์และติดตามสาเหตุของความล้มเหลวหรือข้อผิดพลาด

แต่ยิ่งบันทึกมีขนาดใหญ่เท่าใดก็ยิ่งยากที่จะใช้งาน บางครั้งบันทึกถึงหลายกิกะไบต์ต่อวัน ไม่เป็นไร

1.2 บันทึกที่ล้มเหลว

ในบันทึกแรก นักพัฒนาใช้เพียงเอาต์พุตไปยังคอนโซล สะดวกในการทำเช่นนี้ระหว่างการดีบักแอปพลิเคชัน - เมื่อข้อมูลสำคัญและค่าตัวแปรทั้งหมดถูกเขียนลงในคอนโซล แต่บันทึกดังกล่าวไม่สามารถใช้งานได้อย่างสมบูรณ์ในระหว่างการทำงานปกติของแอปพลิเคชัน

ประการแรกแอปพลิเคชันอาจต้องการส่งออกบางอย่างไปยังคอนโซลเอง และผู้ใช้ไม่ต้องการดูข้อมูลบริการที่มีไว้สำหรับโปรแกรมเมอร์เลย

ประการที่สองขนาดของบัฟเฟอร์คอนโซลมีจำกัด คุณไม่สามารถเขียนได้มากที่นั่น

และประการสุดท้ายประการที่สาม ควรส่งข้อมูลเกี่ยวกับข้อผิดพลาดของโปรแกรมที่รวบรวมเป็นระยะเวลานานไปยังผู้พัฒนาโปรแกรม และสะดวกที่สุดในการเขียนข้อมูลทั้งหมดนี้ลงในไฟล์พร้อมกัน

นักพัฒนาแก้ไขปัญหาแรกอย่างรวดเร็ว - พวกเขาสร้างสตรีมเอาต์พุตอื่นขึ้นมาSystem.err- คุณสามารถเขียนข้อความถึงมันและข้อความเหล่านั้นจะถูกส่งไปยังเธรดแยกต่างหาก ไม่ใช่ไปยังคอนโซลมาตรฐาน

และแม้กระทั่งปัญหาเกี่ยวกับการเขียนไฟล์ก็ได้รับการแก้ไขแล้ว:

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

แต่ถึงแม้จะอยู่ในรูปแบบนี้ ก็ไม่สามารถแก้ปัญหาทั้งหมดได้ ดังนั้นจึงตัดสินใจสร้างไลบรารีพิเศษที่จะเขียนข้อความบันทึกลงในไฟล์ เธอทำสิ่งนี้ด้วยวิธีที่ชาญฉลาดและอนุญาตให้มีความยืดหยุ่นในการกำหนดค่าตัวกรองสำหรับเหตุการณ์และข้อมูลที่บันทึกไว้

ที่จริงแล้วกระบวนการบันทึกทั้งหมดประกอบด้วยสามส่วน:

  • ส่วนแรกคือการรวบรวม ข้อมูล
  • ส่วนที่สองคือการกรองข้อมูลที่รวบรวม
  • ส่วนที่สามเป็นการบันทึกข้อมูลที่เลือกไว้

1.3 ข้อมูลเบื้องต้นเกี่ยวกับตัวบันทึก log4j

คนตัดไม้ที่ได้รับความนิยมคนแรกในชุมชน Java คือlog4j. การรวมไว้ในโปรเจ็กต์นั้นง่ายมาก คุณต้องเพิ่มบรรทัดสองสามบรรทัดใน pom.xml ของคุณ

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

การโต้ตอบของโปรแกรมของคุณกับคนตัดไม้จะมีลักษณะดังนี้:

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;
        }
    }
}

สามสิ่งนี้เกิดขึ้นที่นี่:

การสร้างวัตถุจะถูกเน้นด้วยสี Loggerเขียว วัตถุของมันถูกเก็บไว้ในตัวแปรคงที่เพื่อความสะดวกในการทำงานกับมันต่อไป และgetLogger()ข้อมูลเกี่ยวกับคลาสที่รวบรวมข้อมูลจะถูกส่งผ่านไปยังเมธอด

บรรทัดที่ไฮไลต์ด้วยสีน้ำเงินคือตำแหน่งที่เราบันทึกข้อมูลที่มีค่าระหว่างการดีบักเท่านั้น สำหรับสิ่งนี้จะใช้วิธีพิเศษ -debug()

และสุดท้ายบรรทัดที่เราบันทึกข้อยกเว้นที่เกิดขึ้นกับบันทึกจะถูกเน้นด้วยสีแดง ข้อยกเว้นคือข้อผิดพลาดที่อาจเกิดขึ้น ดังนั้นerror().