1. ภาพรวม
1.1 พื้นหลัง
การบันทึกเป็นสิ่งสำคัญมากในการพัฒนาประจำวันของเรา การเพิ่มการบันทึกในแอปพลิเคชันโดยทั่วไปจะขึ้นอยู่กับวัตถุประสงค์สามประการ: การตรวจสอบการเปลี่ยนแปลงของตัวแปรในรหัสโดยบันทึกเป็นระยะ ๆ ลงในไฟล์สำหรับการวิเคราะห์ทางสถิติโดยแอปพลิเคชันอื่น ๆ การติดตามวิถีการทำงานของรหัสรันไทม์เป็นพื้นฐานสำหรับการตรวจสอบในอนาคต ทำหน้าที่เป็นดีบักเกอร์ในสภาพแวดล้อมการพัฒนาแบบบูรณาการการพิมพ์ข้อมูลการดีบักข้อมูลไปยังไฟล์หรือคอนโซล
1.2 บทนำ
log4j (บันทึกสำหรับ Java) เป็นโครงการโอเพ่นซอร์สของ Apache ซึ่งเป็นวิธีที่ละเอียดอ่อนในการจัดการบันทึก ผ่านไฟล์การกำหนดค่าเราสามารถควบคุมรูปแบบเอาต์พุตและปลายทางของแต่ละบันทึกด้วยตัวเลือกหลายตัวเลือก ด้วยการกำหนดระดับข้อมูลเรายังสามารถเปลี่ยนข้อมูลข้อเสนอแนะในรหัสได้อย่างยืดหยุ่น พูดง่ายๆคือ log4j เป็นไลบรารี API ที่ช่วยให้นักพัฒนาจัดการเอาต์พุตบันทึก คุณลักษณะที่สำคัญที่สุดคือไฟล์การกำหนดค่าสามารถตั้งค่าลำดับความสำคัญของข้อมูลบันทึกปลายทางปลายทางของข้อมูลบันทึกและรูปแบบเอาต์พุตของข้อมูลบันทึก
2. การกำหนดค่า log4j
ไดอะแกรมคลาส 2.1log4j
2.2 การกำหนดไฟล์กำหนดค่า
log4j สามารถตั้งค่าแบบไดนามิกผ่านโปรแกรม Java ข้อเสียที่ชัดเจนของวิธีนี้คือ: หากคุณต้องการแก้ไขระดับเอาต์พุตบันทึกและข้อมูลอื่น ๆ คุณต้องแก้ไขไฟล์ Java แล้วคอมไพล์ใหม่ซึ่งเป็นปัญหามาก
การใช้ไฟล์การกำหนดค่าจะทำให้แอปพลิเคชันของเรามีความยืดหยุ่นมากขึ้นในการกำหนดค่าบันทึกและวิธีการบันทึกเอาต์พุตรวมถึงลำดับความสำคัญของเอาต์พุตปลายทางปลายทางและรูปแบบเอาต์พุต log4j รองรับรูปแบบไฟล์การกำหนดค่าสองรูปแบบหนึ่งคือไฟล์ XML และอีกรูปแบบหนึ่งคือไฟล์คุณสมบัติ Java Log4j.Properties (key = value)
2.3 ไฟล์การกำหนดค่า log4j.properties
เมื่อมีการเรียก log4j เป็นครั้งแรก log4j จะค้นหาไฟล์ใน classpath (../web-inf/class/ แน่นอนตราบใดที่ไดเรกทอรีรวมอยู่ใน classpath) และอ่านการกำหนดค่าที่สมบูรณ์ของไฟล์ ไฟล์การกำหนดค่านี้จะบอก log4j รูปแบบใดข้อมูลใดที่จะส่งออกไปยังที่ที่มันอยู่ ตามลำดับเราจำเป็นต้องกำหนดค่าสามด้าน:
1. ไดเรกทอรีราก (ระดับและปลายทาง);
2. ปลายทาง (คอนโซลไฟล์ ฯลฯ );
3. รูปแบบเอาต์พุต (วิธีการแสดงเนื้อหาบันทึก)
ตัวอย่างมีดังนี้:
#set ระดับเอาต์พุตบันทึก
log4j.rootlogger = debug, appender1
#output ไปยังคอนโซล
log4j.appender.appender1 = org.apache.log4j.consoleappender
#style คือ ttcclayout
log4j.appender.appender1.layout = org.apache.log4j.ttcclayout
2.4. log4j สามองค์ประกอบคำอธิบาย
log4j มีสามองค์ประกอบหลัก: คนบันทึก, Appender (แหล่งเอาท์พุท) และเค้าโครง (เลย์เอาต์) การรวมองค์ประกอบทั้งสามนี้ช่วยให้การบันทึกประเภทและระดับข้อมูลได้ง่ายและสามารถควบคุมสไตล์และตำแหน่งของเอาต์พุตบันทึกได้ที่รันไทม์ ต่อไปนี้เป็นสามองค์ประกอบ:
2.4.1 เครื่องบันทึกเครื่องบันทึก
วัตถุ Logger ใช้เพื่อแทนที่ System.out หรือ System.err ของ Log Writer ซึ่งใช้เพื่อให้โปรแกรมเมอร์ที่มีเอาต์พุตข้อมูลบันทึก
ตัวบันทึกรูทถูกกำหนดค่าด้วยไวยากรณ์:
log4j.rootlogger = [ระดับ], appenderName, appenderName, ...
ในหมู่พวกเขาระดับคือลำดับความสำคัญของการตัดไม้แบ่งออกเป็นปิด, ตาย, ข้อผิดพลาด, เตือน, ข้อมูล, การดีบัก, ระดับทั้งหมดหรือระดับที่กำหนดเอง log4j แนะนำให้ใช้เพียงสี่ระดับโดยมีลำดับความสำคัญจากสูงถึงต่ำคือข้อผิดพลาดคำเตือนข้อมูลและการดีบัก ตามระดับที่กำหนดไว้ที่นี่คุณสามารถควบคุมสวิตช์ไปยังระดับข้อมูลบันทึกที่สอดคล้องกันในแอปพลิเคชัน ตัวอย่างเช่นหากระดับข้อมูลถูกกำหนดไว้ที่นี่ข้อมูลบันทึกระดับการดีบักทั้งหมดในแอปพลิเคชันจะไม่ถูกพิมพ์ออกมา AppEnderName ระบุตำแหน่งที่ข้อมูลบันทึกถูกส่งออกไป สามารถระบุปลายทางเอาต์พุตหลายจุดพร้อมกันได้
2.4.2 เอ็กเมนต์ปลายทางเอาท์พุท
ระบบบันทึก log4j อนุญาตให้เอาต์พุตบันทึกไปยังสถานที่ต่าง ๆ เช่นคอนโซล (คอนโซล) ไฟล์ (ไฟล์) ไฟล์ใหม่จะถูกสร้างขึ้นตามวันหรือขนาดไฟล์และส่งไปยังสถานที่อื่น ๆ ในรูปแบบของสตรีม ฯลฯ
กำหนดค่า Appender ไวยากรณ์ของมันจะแสดงเป็น:
log4j.appender.appenderName = fully.qualified.name.of.appender.classlog4j.appender.appendername.option1 = value1 … log4j.appender.appendername.option = valuen
"full.qualified.name.of.appender.class" สามารถระบุหนึ่งในห้าปลายทางต่อไปนี้:
1) .org.apache.log4j.ConsoleAppender (คอนโซล)
2) .org.apache.log4j.FileAppender (ไฟล์)
3) .org.apache.log4j.dailyrollingFileAppender (สร้างไฟล์บันทึกหนึ่งไฟล์ทุกวัน)
4) .org.apache.log4j.rollingFileAppender (ไฟล์ใหม่ถูกสร้างขึ้นเมื่อขนาดไฟล์ถึงขนาดที่ระบุ)
5) .org.apache.log4j.writerappender (ส่งข้อมูลบันทึกในรูปแบบสตรีมไปยังสถานที่ที่ระบุใด ๆ )
(1). ตัวเลือกของ ConsoleAppender
(2). ตัวเลือก FileAppender
(3) .DailyrollingFilePender ตัวเลือก
นั่นคือรูปแบบที่เกี่ยวข้องมีดังนี้:
1) '.' yyyy-mm: รายเดือน
2) '.' yyyy-ww: รายสัปดาห์
3) '.' yyyy-mm-dd: ทุกวัน
4) '.' yyyy-mm-dd-a: วันละสองครั้ง
5) '.' yyyy-mm-dd-hh: ชั่วโมง
6) '.' yyyy-mm-dd-hh-mm: ต่อนาที
4. ตัวเลือก RollingFilePender
2.4.3 รูปแบบ (เค้าโครง) เลย์เอาต์
บางครั้งฉันต้องการจัดรูปแบบเอาต์พุตบันทึกของตัวเองตามการตั้งค่าของฉัน log4j สามารถแนบเค้าโครงด้านหลัง Appender เพื่อทำฟังก์ชั่นนี้ให้เสร็จสมบูรณ์
กำหนดค่าเค้าโครงไวยากรณ์ของมันจะแสดงเป็น:
log4j.appender.appenderName.layout = fulllified.name.of.layout.classlog4j.appender.appendername.layout.option1 = ค่า 1 … log4j.appender.appendername.layout.option = valuen
เลย์เอาต์มีรูปแบบเอาต์พุตบันทึกสี่รูปแบบดังนี้:
(1) .org.apache.log4j.htmllayout (เลย์เอาต์ในรูปแบบตาราง HTML)
(2) .org.apache.log4j.patternlayout (โหมดเลย์เอาต์สามารถระบุได้อย่างยืดหยุ่น)
(3) .org.apache.log4j.simplelayout (มีระดับและสตริงข้อมูลของข้อมูลบันทึก)
(4) .org.apache.log4j.ttcclayout (รวมถึงเวลาสร้างบันทึกเธรดหมวดหมู่ ฯลฯ ข้อมูล)
ตัวเลือก htmllayout
locationInfo = true: ค่าเริ่มต้นเป็นเท็จเอาต์พุตชื่อไฟล์ Java และหมายเลขบรรทัด
title = ไฟล์แอพของฉัน: ค่าเริ่มต้นคือข้อความบันทึก log4j
2. ตัวเลือกแบบ Patternlayout
ConversionPattern =%M%N: ระบุวิธีการจัดรูปแบบข้อความที่ระบุ
สิ่งที่ต้องอธิบายที่นี่คือความหมายของสัญลักษณ์หลายอย่างในรูปแบบข้อมูลบันทึก:
ตัวดัดแปลงสามารถเพิ่มได้ระหว่าง % และอักขระรูปแบบเพื่อควบคุมความกว้างขั้นต่ำความกว้างสูงสุดและการจัดตำแหน่งข้อความ ชอบ:
1)%20C: ระบุชื่อของหมวดหมู่เอาต์พุตความกว้างขั้นต่ำคือ 20 ถ้าชื่อของหมวดหมู่น้อยกว่า 20 มันจะได้รับการจัดแนวขวาโดยค่าเริ่มต้น
2)%-20C: ระบุชื่อของหมวดหมู่เอาต์พุตความกว้างขั้นต่ำคือ 20 ถ้าชื่อของหมวดหมู่น้อยกว่า 20, เครื่องหมาย "-" ระบุการจัดตำแหน่งซ้าย
3)%. 30c: ระบุชื่อของหมวดหมู่เอาต์พุต ความกว้างสูงสุดคือ 30 ถ้าชื่อของหมวดหมู่มากกว่า 30 อักขระพิเศษทางด้านซ้ายจะถูกตัดออก แต่ถ้ามีน้อยกว่า 30 จะไม่มีช่องว่าง
4)%20.30C: หากชื่อของหมวดหมู่น้อยกว่า 20 ให้กรอกข้อมูลในพื้นที่และจัดตำแหน่งให้ถูกต้อง หากชื่อของมันยาวกว่า 30 อักขระให้ตัดอักขระพิเศษจากด้านซ้าย
2.5.log4j ตัวอย่างการกำหนดค่า
ความเรียบง่ายของการกำหนดค่า log4j ทำให้มันแพร่กระจายไปทั่วแอปพลิเคชันมากขึ้นเรื่อย ๆ : ไฟล์การกำหนดค่า log4j ใช้ชุดฟังก์ชันที่สมบูรณ์เช่นเอาต์พุตไปยังคอนโซลไฟล์ไฟล์ย้อนกลับส่งจดหมายบันทึกเอาต์พุตไปยังตารางบันทึกฐานข้อมูลและแท็กที่กำหนดเอง
log4j.rootlogger = debug, คอนโซล, a1, im log4j.addivity.org.apache = true
n ใช้กับคอนโซล
log4j.appender.console = org.apache.log4j.consoleappenderlog4j.appender.threshold = debug log4j.appender.console.target = system.outlog4j.appender.console.layout = org.log4j.patternlayout log4j.appender.console.layout.conversionPattern =%d-%c-%-4r [%t]%-5p%c%x-%m%n
N ใช้กับไฟล์
log4j.appender.file = org.apache.log4j.FileAppenderLog4j.appender.file.file = file.loglog4j.appender.file.append = falselog4j.appender.file.layout = org.log4j.patternlaylog4j.log4 %c - % -4r [ %t] %-5p %c %x - %m %n
n ใช้กับการย้อนกลับไฟล์
log4j.appender.rolling_file = org.apache.log4j.rollingFileAppenderLog4j.appender.rolling_file.threshold = errorlog4j.appender.rolling_file.file. Ender.rolling_file.MaxFilesize = 10Kblog4j.appender.rolling_file.maxbackupIndex = 1log4j.appender.rolling_file.layout = org.apache.log4j.patternlayoutlog4j.appender.rolling_file.lay.lay %-5p %c %x - %m %n
n ใช้กับซ็อกเก็ต
log4j.appender.socket = org.apache.log4j.rollingFileAppenderLog4j.appender.socket.remotehost = localhost log4j.appender.socket.port = 5001log4j.appender.socket.locationinfo = True log4j.appender.socket.layout = org.apache.log4j.patternlayoutlog4j.appender.socet.layout.conversionPattern = [เริ่มต้น]%d {วันที่} [วันที่]%n%p [ลำดับความสำคัญ]%n%x [ndc]%n% Appender log4j.appender.lf5_appender = org.apache.log4j.lf5.lf5appender log4j.appender.lf5_appender.maxnumberofrecords = 2000n ส่งบันทึกไปยังอีเมล
log4j.appender.mail = org.apache.log4j.net.smtpappenderlog4j.appender.mail.threshold = fatallog4j.appender.mail.buffersize = 10log4j.appender.mail.from=web@www.wuset.comlog4j.appender.mail.smtphost=www.wusetu.comlog4j.appender.mail.subject=log4j ข้อความ log4j.appender.mail.to=web@www.wusetu.comlog4j.appender.mail.layout=org.apache.log4j.patternlayout log4j.appender.mail.layout.conversionPattern =%d-%c-%-4r
n สำหรับฐานข้อมูล
log4j.appender.database = org.apache.log4j.jdbc.jdbcappenderlog4j.appender.database.url = jdbc: mysql: // localhost: 3306/testlog4j.appender.database.driver = com.mysql.jdriver log4j.appender.database.user = rootlog4j.appender.database.password = log4j.appender.database.sql = แทรกลงใน log4j (ข้อความ) ค่า (' %d - %c - % -4r [ %t] %-5p %c %x - %m %n ') log4j.appender.database.layout = org.apache.log4j.patternlayout log4j.appender.database.layout.conversionPattern =%d-%c-%-4r [%t]%-5p%c%x-%m%nlog4j.appender.a1 = org.apache.log4j.dailyrolling log4j.appender.a1.datepattern = yyyymmdd-hh'.log4j'log4j.appender.a1.layout = org.apache.log4j.xml.xmllayoutn appender ที่กำหนดเอง
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppenderlog4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = [email protected]=org.apache.log4j.patternlayoutlog4j.appender.im.layout.conversionPattern = [เฟรมเวิร์ก] %d - %c -4r
3. กำหนดค่า log4j สำหรับฤดูใบไม้ผลิในเว็บแอปพลิเคชัน
ก่อนอื่นคุณต้องเพิ่มคำสั่งการกำหนดค่าต่อไปนี้ในไฟล์ web.xml:
<!-เพื่อหลีกเลี่ยงความขัดแย้งระหว่างโครงการให้กำหนด webapprootkey ที่ไม่ซ้ำกัน-> <context-param> <param-name> webapprootkey </param-name> <param-value> myProject.root </param-value> </context-param> <!-โหลดไฟล์การกำหนดค่า log4j.properties-> <param-value> /web-inf/classes/config/log4j/log4j.properties </param-value> </context-param> <!-ตั้งค่าช่วงเวลาสำหรับการรีเฟรชไฟล์การกำหนดค่าบันทึกการตั้งค่าเป็น 60s ที่นี่-> <context-param> <param-value> 60000 </param-value> </context-param> <!-โหลด Log4j Listener ใน Framework Spring Log4JConfigListener-> <Sistener>
ขอแนะนำให้ตั้งค่าของคุณสมบัติ log4jconfiglocation เป็น: /web-inf/classes/log4j.properties ดังนั้นเมื่อเราทำการทดสอบบางอย่างเราสามารถบันทึกข้อมูลบันทึกได้อย่างถูกต้องเมื่อเราไม่เริ่มเว็บแอปพลิเคชัน log4jconfigListener เป็นคลาสเครื่องมือที่จัดทำโดยฤดูใบไม้ผลิ มันเปิดเธรดการตรวจสอบ log4j และตรวจจับการเปลี่ยนแปลงการกำหนดค่าบันทึกทุก ๆ 60 วินาที (คำจำกัดความตัวแปร log4jrefreshinterval) ดังนั้นจึงไม่จำเป็นต้องรีสตาร์ทบริการเว็บทุกครั้งเพื่อใช้การกำหนดค่าใหม่ ใน Tomcat ไม่มีคุณสมบัติของระบบถูกแยกออกจากเว็บแอปพลิเคชัน ดังนั้นต้องกำหนด "webapprootkey" ที่ไม่ซ้ำกันสำหรับแต่ละเว็บแอปพลิเคชันและเราตั้งชื่อมันว่า webapp.root หลังจากเริ่มสภาพแวดล้อม log4jconfigListener จะฉีดค่าลงในตัวแปร webapp.root
4. ใช้ log4j ในรหัส
4.1. รับเครื่องบันทึก
การใช้ log4j ขั้นตอนแรกคือการรับบันทึกบันทึกซึ่งจะรับผิดชอบในการควบคุมข้อมูลบันทึก
Public Static Logger GetLogger (ชื่อสตริง)
รับเครื่องบันทึกด้วยชื่อที่ระบุและหากจำเป็นให้สร้างตัวบันทึกใหม่สำหรับชื่อ ชื่อโดยทั่วไปมีชื่อในชั้นเรียนนี้เช่น:
Logger Logger แบบคงที่ = logger.getLogger (ServerWithLog4j.class.getName ())
4.2. อ่านไฟล์กำหนดค่า
หลังจากได้รับ logger ขั้นตอนที่สองจะกำหนดค่าสภาพแวดล้อม log4j ด้วยไวยากรณ์เป็น:
หากคุณวาง log4j.properties ในไดเรกทอรีรูทของโครงการคุณยังไม่สามารถเขียนประโยคนี้และโปรแกรมจะค้นหาไฟล์การกำหนดค่าโดยอัตโนมัติ
BasicConfigurator.Configure (): โดยอัตโนมัติและใช้สภาพแวดล้อม LOG4J เริ่มต้นโดยอัตโนมัติ PropertyConfigurator.Configure (สตริง configfilename): อ่านไฟล์การกำหนดค่าที่เขียนโดยใช้ไฟล์คุณสมบัติของ Java
domconfigurator.configure (ชื่อไฟล์สตริง): อ่านไฟล์การกำหนดค่าในรูปแบบ XML
log4j เริ่มต้นโดยใช้ตัวกำหนดค่า 3 ตัวข้างต้นและการใช้ PropertyConfigurator เหมาะสำหรับทุกระบบ ข้อความต่อไปนี้
PropertyConfigurator.configure ("log4j.properties");สำหรับโครงการ Java ทั่วไป Log4J สามารถเริ่มต้นได้โดยไม่ต้องใช้คำสั่งข้างต้น log4j จะค้นหาไฟล์การกำหนดค่าภายใต้ classPath โดยอัตโนมัติและเริ่มต้น หาก log4j ไม่สามารถเริ่มต้นไฟล์การกำหนดค่าโดยอัตโนมัติวิธีการข้างต้นจะต้องเริ่มต้น
หมายเหตุ: เมื่อเริ่มต้นไฟล์การกำหนดค่าจะเป็นการดีที่สุดที่จะดำเนินการเพียงครั้งเดียวเมื่อระบบเริ่มต้น หากดำเนินการหลายครั้งหนึ่งคือการเสียทรัพยากรและอีกอย่างคือสำหรับ Log4j รุ่นเก่าอาจเกิดปัญหาเมื่อใช้ DailyrollingFileAppender
4.3. แทรกข้อมูลบันทึก (ข้อมูลบันทึกรูปแบบ)
เมื่อสองขั้นตอนที่จำเป็นก่อนหน้านี้เสร็จสมบูรณ์คุณสามารถแทรกคำสั่งการบันทึกที่มีระดับลำดับความสำคัญที่แตกต่างกันได้ทุกที่ที่คุณต้องการบันทึก ไวยากรณ์มีดังนี้:
logger.debug (ข้อความวัตถุ);