1.1 รู้เบื้องต้นเกี่ยวกับบันทึก
บันทึกคือรายการเหตุการณ์ที่เกิดขึ้น เกือบจะเหมือนบันทึกการเดินเรือหรือไดอารี่ ดังนั้นคนตัดไม้ จึง เป็นวัตถุที่คุณสามารถบันทึกได้ ในการเขียนโปรแกรมเป็นเรื่องปกติที่จะต้องบันทึกเกือบทุกอย่าง และใน Java ทุกอย่างเป็นเช่นนั้นและมากกว่านั้นอีกเล็กน้อย
![คนตัดไม้จาวา](https://cdn.codegym.cc/images/article/df09efd4-dece-47be-a17c-a89c3b63974e/800.jpeg)
ความจริงก็คือโปรแกรม 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()
.