บทความนี้ส่วนใหญ่แนะนำการกำหนดค่าของ SLF4J+logback ใน Java Engineering
ก่อนที่จะแนะนำการกำหนดค่า SLF4J+logback ก่อนอื่นแนะนำ logback logback ของส่วนประกอบบันทึก
(1) บทนำและการกำหนดค่าของการบันทึกส่วนประกอบบันทึก
1. บทนำสู่การเข้าสู่ระบบ
Logback เป็นส่วนประกอบบันทึกโอเพนซอร์สอื่นที่ออกแบบโดยผู้ก่อตั้ง Log4J การบันทึกกลับถูกแบ่งออกเป็นสามโมดูล: logback-core, logback-classic และ logback-activity Logback-Core เป็นโมดูลพื้นฐานของอีกสองโมดูล Logback-Classic เป็นเวอร์ชันที่ได้รับการปรับปรุงของ log4j นอกจากนี้ Logback-Classic ยังใช้ SLF4J API อย่างเต็มที่เพื่อให้คุณสามารถแทนที่ด้วยระบบบันทึกอื่น ๆ เช่น Log4J หรือ JDK14 การบันทึก โมดูลการเข้าถึง LogBack-Access รวมเข้ากับคอนเทนเนอร์ Servlet เพื่อให้ฟังก์ชั่นการเข้าถึงบันทึกผ่าน HTTP Logback เป็นเว็บไซต์อย่างเป็นทางการที่รวมสององค์ประกอบเข้ากับ SLF4J ดังนี้:
เว็บไซต์อย่างเป็นทางการของ Logback: http://logback.qos.ch
เว็บไซต์ทางการของ SLF4J: http://www.slf4j.org
ส่วนประกอบที่ใช้ในบทความนี้มีดังนี้: โปรดไปที่เว็บไซต์ทางการเพื่อดาวน์โหลด!
logback -Access -.0.0.jar
logback -classic -.0.0.jar
logback-core-1.0.0.jar
slf4j-api-1.6.0.jar
2. เหตุผลในการเข้าสู่ระบบเพื่อแทนที่ log4j:
logback และ log4j คล้ายกันมาก นี่คือข้อดีของการเข้าสู่ระบบมากกว่า log4j:
1. เร็วขึ้นใช้งานเคอร์เนลใหม่ของการเข้าสู่ระบบและประสิทธิภาพจะเพิ่มขึ้นมากกว่า 10 เท่าในเส้นทางการดำเนินการที่สำคัญบางอย่าง ยิ่งกว่านั้นการเข้าสู่ระบบไม่เพียง แต่ปรับปรุงประสิทธิภาพ แต่ยังมีการโหลดหน่วยความจำที่เริ่มต้นน้อยลง
2. การทดสอบการกลับรายการแบบทดสอบเต็มรูปแบบได้รับการทดสอบเป็นเวลาสองสามปีนับไม่ถ้วน การทดสอบของ Logback นั้นแตกต่างอย่างสิ้นเชิง จากมุมมองของผู้เขียนนี่เป็นเหตุผลที่ง่ายและสำคัญในการเลือก logback แทน log4j
3. Logback-Classic ถูกนำไปใช้ตามธรรมชาติด้วย SLF4J logback-classic เพื่อให้ได้ SLF4J ในการใช้ SLF4J คุณไม่สามารถรู้สึกถึงการบันทึกแบบคลาสสิก ยิ่งไปกว่านั้นเนื่องจาก Logback-Classic ใช้ SLF4J อย่างเป็นธรรมชาติการเปลี่ยนไปใช้ log4j หรืออื่น ๆ เป็นเรื่องง่ายมาก
4. เว็บไซต์อย่างเป็นทางการเอกสารเต็มรูปแบบมีเอกสารมากกว่า 200 หน้า
5. การโหลดไฟล์การกำหนดค่าซ้ำโดยอัตโนมัติเป็นการปรับเปลี่ยนไฟล์การกำหนดค่า Logback-Classic สามารถโหลดไฟล์การกำหนดค่าใหม่โดยอัตโนมัติ กระบวนการสแกนนั้นรวดเร็วและปลอดภัยไม่จำเป็นต้องสร้างเธรดการสแกนอื่น เทคโนโลยีนี้รับประกันได้อย่างเต็มที่ว่าแอปพลิเคชันสามารถทำงานในสภาพแวดล้อม JEE
6. Lilith Lilith เป็นผู้สังเกตการณ์ของเหตุการณ์บันทึกคล้ายกับเลื่อยไฟฟ้าของ log4j Lilith ยังสามารถประมวลผลข้อมูลบันทึกจำนวนมาก
7. โหมดข้อควรระวังและการกู้คืนที่เป็นมิตรมากในโหมดข้อควรระวังอินสแตนซ์ FileAppender หลายรายการทำงานภายใต้ JVM หลายตัวและสามารถเขียนไฟล์บันทึกเดียวกันได้อย่างปลอดภัย RollingFileAppender จะมีข้อ จำกัด บางประการ FileAppender ของ Logback และคลาสย่อยรวมถึง RollingFileAppender สามารถกู้คืนได้จากข้อยกเว้น I/O ที่เป็นมิตรมาก
8. ไฟล์การกำหนดค่าสามารถจัดการกับสถานการณ์ที่แตกต่างกันได้ ไฟล์การกำหนดค่าเหล่านี้มีความแตกต่างเพียงเล็กน้อยเท่านั้นซึ่งสามารถนำไปใช้และนำไปใช้งานเพื่อให้ไฟล์การกำหนดค่าสามารถปรับให้เข้ากับสภาพแวดล้อมที่หลากหลาย
9. ตัวกรอง (ตัวกรอง) บางครั้งจำเป็นต้องมีปัญหาและจำเป็นต้องมีบันทึก ใน log4j ลดระดับบันทึกเท่านั้น แต่จะทำให้บันทึกจำนวนมากและส่งผลกระทบต่อประสิทธิภาพของแอปพลิเคชัน ที่ Logback คุณสามารถรักษาระดับบันทึกไว้ต่อไปและลบกรณีพิเศษบางอย่างได้ เพื่อให้ได้ฟังก์ชั่นนี้คุณจะต้องเพิ่มการกำหนดค่า XML 4 บรรทัดเท่านั้น คุณสามารถอ้างถึง MDCFilter
10. SiftingAppener (Appender ที่มีความหลากหลายมาก) สามารถใช้เพื่อหารไฟล์บันทึกตามพารามิเตอร์การทำงานใด ๆ ที่กำหนด ตัวอย่างเช่น SiftingAppender สามารถแยกเซสชันของผู้ใช้ที่ติดตามเซสชันของผู้ใช้และจากนั้นผู้ใช้แต่ละคนจะมีไฟล์บันทึก
11. บีบอัด Log RollingFileAppender โดยอัตโนมัติที่ได้รับการตี การบีบอัดเป็นกระบวนการแบบอะซิงโครนัสดังนั้นแม้กระทั่งไฟล์บันทึกขนาดใหญ่แอปพลิเคชันจะไม่ได้รับผลกระทบในกระบวนการบีบอัด
12. สแต็กทรีมีแพ็คเกจของการกลับมาของแพ็คเกจ
13. ลบไฟล์บันทึกเก่าโดยอัตโนมัติโดยการตั้งค่าคุณสมบัติ MaxHistory ของ TimebasedRollingPolicy หรือ SizeandtimeBasedFnatp หากตั้งค่า MaxHistory 12 ไฟล์บันทึกที่เกิน 12 เดือนจะถูกลบออกโดยอัตโนมัติ
ในระยะสั้น logback ดีกว่า log4j
3. บทนำเกี่ยวกับการกำหนดค่าของ logback
1. คนบันทึก, appender และ layout
Logger เป็นเครื่องบันทึกของบันทึกเชื่อมโยงกับบริบทที่เกี่ยวข้องที่ใช้เป็นหลักในการจัดเก็บวัตถุบันทึก
Appender ส่วนใหญ่จะใช้เพื่อระบุปลายทางของเอาต์พุตบันทึก
เค้าโครงรับผิดชอบการส่งออกของเหตุการณ์ลงในสตริงข้อมูลบันทึกที่จัดรูปแบบ
2. บริบท Logger
ผู้บันทึกแต่ละคนเชื่อมโยงกับ LoggerContext เครื่องบันทึกอื่น ๆ ทั้งหมดได้รับผ่านวิธีการคงที่ของ org.slf4j.loggerfactory คลาส getLogger วิธี getLogger ตั้งชื่อโดย logger ใช้ชื่อเดียวกันเพื่อเรียกวิธีการ loggerFactory.getLogger
3. มรดกของระดับและระดับที่มีประสิทธิภาพ
คนตัดไม้สามารถกำหนดได้ ระดับรวมถึง: การติดตาม, การดีบัก, ข้อมูล, คำเตือนและข้อผิดพลาดที่กำหนดไว้ในชั้นเรียน ch.qos.logback.classic.level หากไม่ได้รับมอบหมายให้คนตัดไม้แสดงว่าจะสืบทอดระดับจากบรรพบุรุษที่ใกล้เคียงที่สุดของระดับการกระจาย ระดับเริ่มต้นของ Root Logger คือการดีบัก
4. วิธีการพิมพ์และกฎการเลือกพื้นฐาน <br /> วิธีการพิมพ์กำหนดระดับของคำขอ ตัวอย่างเช่นหาก L เป็นอินสแตนซ์ของ Logger ดังนั้นคำสั่ง l.info (".. ") เป็นคำสั่งบันทึกที่มีข้อมูลระดับ ระดับของคำขอบันทึกถูกเรียกว่าเปิดใช้งานเมื่อสูงกว่าหรือเท่ากับระดับที่ถูกต้องของ logger มิฉะนั้นจะเรียกว่าปิดใช้งาน ระดับคำขอบันทึกคือ P และระดับที่ถูกต้องของ Logger คือ Q เท่านั้น
กฎนี้เป็นหัวใจสำคัญของการเข้าสู่ระบบ การเรียงลำดับระดับคือ: trace <debug <info <warn <ข้อผิดพลาด
4. การกำหนดค่าเริ่มต้นของ LogBack <br /> หากไม่มีการกำหนดค่าไฟล์ logback-test.xml และ logback.xml แล้ว Logback จะเรียก BasicConfigurator โดยค่าเริ่มต้นเพื่อสร้างการกำหนดค่าที่ย่อค่า เพื่อลดการกำหนดค่าประกอบด้วยคอนโซลแอปที่เกี่ยวข้องกับตัวบันทึกรูท โหมดเอาท์พุทคือ %d {HH: MM: SS.SS} [Thread %] %-5Level %Logger {36} - %MSG %N's PatternLayOutEndCoder ระดับเริ่มต้นของ Root Logger คือการดีบัก
1. ไฟล์การกำหนดค่าของ logback
ไวยากรณ์ของไฟล์การกำหนดค่า logback มีความยืดหยุ่นมาก เนื่องจากความยืดหยุ่นไม่สามารถกำหนดสคีมา DTD หรือ XML ได้ อย่างไรก็ตามคุณสามารถอธิบายโครงสร้างพื้นฐานของไฟล์การกำหนดค่าด้วยวิธีนี้: เริ่มต้นด้วย <การกำหนดค่า> ไม่มีองค์ประกอบ <ppender> เป็นศูนย์หรือมากกว่าองค์ประกอบ <logger> และองค์ประกอบสูงสุด <root>
2. ขั้นตอนของการกำหนดค่าเริ่มต้นของ logback
(1)
(2)
(3)
3. ไฟล์ logback.xml
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <การกำหนดค่า> <!-กำหนดที่อยู่ที่เก็บข้อมูลของไฟล์บันทึก appender name = "stdout"> <!-การเข้ารหัสเอาต์พุตบันทึก-> <coding> UTF-8 </Scoding> <laayout> <!-รูปแบบเอาต์พุต:%D หมายถึงวันที่,%เธรดระบุชื่อเธรด,%-5Level: ระดับความกว้างของอักขระระดับ 5 จากจอแสดงผลด้านซ้าย 5 ความกว้างของอักขระ%msg: ข้อความบันทึก,%n คือสัญลักษณ์การเปลี่ยนแปลง-> <ustern>%d {yyyy-mm-dd hh: mm: ss.sss} [%เธรด]%- 5Level %logger {50}- %msg %n </pattern> </layout> </appender> <!-สร้างไฟล์บันทึกทุกวัน-> <ppender name = "ไฟล์"> <coding> UTF-8 </ การเข้ารหัส> <rollingPolicy> <!-เอาต์พุตชื่อไฟล์โดยบันทึกไฟล์-> <filenamePattern> $ {log_home} /myapp.log.%d {yyyy-mm-dd} /maxhistory> </rollingpolice> <soutout> <!-เอาต์พุตสูตร:%d แสดงวันที่,%เธรดหมายถึงชื่อเธรด,%d หมายถึงชื่อเธรด,%-5level: 5 อักขระความกว้างแสดงจาก%msg ด้านซ้าย: ข้อความบันทึก,%n เป็นอักขระการเปลี่ยนแปลง-> <pattern>%d {yyyy-mm-dd hh: mm: ss.sss} [%เธรด]%-5level%logger {50}-%msg%n </รูปแบบ > </layout> <!-ขนาดที่ใหญ่ที่สุดของไฟล์บันทึก-> <TriggeringPolice> <MaxFilesize> 10MB </maxfilesize> </triggeringPolice> </appen der> <!-แสดงพารามิเตอร์สำหรับ Hibernate SQL -> <logger name = "organnate.type.descriptor.sql.basicbinder =" trace " /> <logger =" org.hibernate org.hibernate.sql "level =" def " /> <log. eRameters" ระดับ = "debug" /> <logger name = "org.hibernate.engine.qury.hqlqueryplan" ระดับ = "debug" /> <! บันทึกเอาต์พุตระดับ-> <ระดับรูท = "ข้อมูล"> <ppender-ref = "stdout" /> <ppender-ref ref = "ไฟล์" /> </root> <!-บันทึกไปยังฐานข้อมูล-> <ppender ชื่อ = "DB"> <! DatabasEname </url> <user> รูท </user> <password> รูท </รหัสผ่าน> </dataSource> </connectionsource> </appender> -> </การกำหนดค่า >> </การกำหนดค่า >> </การกำหนดค่า >> </การกำหนดค่า >> 5. ใช้ logback อ้างอิงในโปรแกรม
แพ็คเกจ com.stu.system.action; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; blogaction คลาสสาธารณะ {// กำหนด logger ทั่วโลกที่ได้รับผ่าน LoggerFactory คลาส);ถัดไปเรามาแนะนำการกำหนดค่าของ SLF4J+logback ในโครงการ Java
1. maven -based slf4j+logback pom.xml การกำหนดค่า
<Ederency> <roupID> org.slf4j </groupId> <ratifactId> SLF4J-API </artifactId> <Sersion> 1.7.10 </SerfiS <ArtIfactId> logback-classic </artifactid> <persion> 1.1.2 </Sersion> </EdEdecy> <G.Qos /เวอร์ชัน> </การพึ่งพา>
2. สร้างไฟล์การกำหนดค่า logback.xml ใหม่ในไดเรกทอรี classpath
<? xml version = "1.0" การเข้ารหัส = "UTF-8"?> <!-สแกน: เมื่อคุณสมบัตินี้ถูกตั้งค่าเป็นจริงหากไฟล์การกำหนดค่าเปลี่ยนไปมันจะถูกโหลดซ้ำและค่าเริ่มต้นเป็นจริง Scanperiod: ตั้งค่าช่วงเวลาเพื่อตรวจสอบว่ามีการปรับเปลี่ยนไฟล์การกำหนดค่าหรือไม่ ช่วงเวลาเริ่มต้นคือ 1 นาที DEBUG: เมื่อตั้งค่าแอตทริบิวต์นี้เป็น TRUE ข้อมูลการบันทึกภายใน LOGBACK จะถูกพิมพ์เพื่อตรวจสอบสถานะการทำงานของ LOGBACK แบบเรียลไทม์ ค่าเริ่มต้นเป็นเท็จ -> <การกำหนดค่า scan = "false" scanperiod = "60 วินาที" debug = "false"> <!-กำหนดไดเรกทอรีรากของบันทึก-> <property name = "log_home" value = "/app/log " /> <!-กำหนดชื่อไฟล์บันทึก-> <property name =" appName "value =" netty "> < / คุณสมบัติ> <!-ch.qos.logback.core.consoleAppender ระบุเอาต์พุตคอนโซล-> <appender name = "stdout"> <การเข้ารหัส> UTF-8 </encoding> <!-รูปแบบเอาต์พุตบันทึก:%d หมายถึงวันที่,%เธรดหมายถึงชื่อเธรด,%-5Level: ระดับความกว้างของอักขระ 5 ระดับจากซ้าย% %%%%%% 5 ความกว้างของอักขระ %%%%% 2. logger {50} หมายความว่าชื่อตัวบันทึกคือ 50 อักขระมิฉะนั้นจะถูกแบ่งตามระยะเวลา %msg: ข้อความบันทึก, %n คือการเปลี่ยนแปลงของบรรทัด-> <ydayout> <matter> %d {yyyy-mm-dd hh: mm: ss.ss} [ %เธรด] %-5level %logger {50}- % msg% n </pattern> </layout> </appender> <!- เลื่อนเพื่อบันทึกไฟล์บันทึกแรกบันทึกไปยังไฟล์ที่ระบุและเมื่อตรงตามเงื่อนไขบางอย่างให้บันทึกบันทึกไปยังไฟล์อื่น ๆ- -> <appender name = "apploGappender"> <coding> utf-8 </scoding> <!-ชื่อของบันทึกบันทึกที่กำหนด-> <file> $ {log_home}/$ {appname} .log </li, file> <เมื่อกลิ้งมันมีการพิจารณาว่าพฤติกรรมของ RollingFilePender เกี่ยวข้องกับการเคลื่อนไหวของไฟล์และเปลี่ยนชื่อ TimebasedRollingPolicy: กลยุทธ์การกลิ้งที่ใช้กันมากที่สุด -> <RollingPolicy> <!-ตำแหน่งที่เก็บข้อมูลและชื่อไฟล์ของไฟล์ที่สร้างขึ้นระหว่างการกลิ้ง%d {yyyy-mm-dd}: ม้วนม้วนทุกวัน AppName}-%d {yyyy-mm-dd}-%i.log </filenamepattern> <!-โหนดเสริมควบคุมไฟล์เก็บถาวรที่สงวนไว้มากที่สุดหากปริมาณเกินปริมาณลบไฟล์เก่า สมมติว่ามีการรีดทุกวันและ Maxhistory คือ 365 มีเพียงไฟล์ 365 วันสุดท้ายเท่านั้นที่จะถูกบันทึกเพื่อลบไฟล์เก่าก่อน โปรดทราบว่าไฟล์เก่าจะถูกลบและไดเรกทอรีเหล่านั้นที่สร้างขึ้นสำหรับคลังเก็บจะถูกลบ -> <maxhistory> 365 </maxhistory> <!-ขนาดของไฟล์บันทึกเกิน MaxFilesize และไฟล์บันทึกที่กลิ้งไปตาม%ที่ฉันได้กล่าวถึงข้างต้นให้ความสนใจกับการกำหนดค่า SizebasedTricgeGepolicy TimebasedFilenamingandtriggeringPolicy> <maxfilesize> 100MB </maxfilesize> </timebasedfilenamingan dtriggeringpolicy> </rollingpolicy> <!-รูปแบบเอาต์พุตบันทึก:%d หมายถึงเวลาวันที่ จอแสดงผลด้านซ้าย 5 ตัวอักษรความกว้าง%logger {50} ระบุว่าชื่อตัวบันทึกคือ 50 อักขระมิฉะนั้นจะถูกแบ่งตามระยะเวลา %MSG: ข้อความบันทึก, %n คือการเปลี่ยนแปลงของบรรทัด-> <laayout> <matter> %d {yyyy-mm-dd hh: mm: ss.sss} [ %เธรด]-[ %-5level] [ %logger {50}: %line]- %msg %n </pattern> </layout> </appender> <!- Logger ส่วนใหญ่ใช้เพื่อจัดเก็บวัตถุบันทึก ครึ่งแรกของระดับแพ็คเกจ: ระดับบันทึกที่จะบันทึกรวมถึงการติดตาม <debug <info <warn <ข้อผิดพลาดเพิ่มเติม: ฟังก์ชั่นคือว่าเด็ก-ล็อกเกอร์ใช้ Appender ที่กำหนดค่าโดย Rootlogger สำหรับเอาต์พุตหรือไม่ appender ของ logger ปัจจุบันถูกใช้ -ref, true: appender-ref และ rootlogger ของ logger-ref ปัจจุบันและ rootlogger-refs มีประสิทธิภาพ-> <!-hibernate logger-> <logger name = "org.hibernate" ระดับ " = "ข้อผิดพลาด" /> <! "level =" info "additivity =" true "> <ppender-ref ref =" applogappender " /> < /logger> <!-รูทและคนบันทึกคือความสัมพันธ์ระหว่างพ่อกับลูกชายหากไม่มีคำจำกัดความพิเศษ ค่าเริ่มต้น -> <ระดับ root = "info"> <ppender-ref = "stdout" /> <ppender-ref = "apploGappender" /> </root> < /การกำหนดค่า>