Kata pengantar
Karena ukuran proyek menjadi lebih besar dan lebih besar, modul baru akan diperkenalkan secara terus menerus. Modul yang berbeda akan mencetak log mereka sendiri, yang pada akhirnya akan menyebabkan log tidak dapat dilihat. Misalnya, dalam proyek saya sendiri, ada log berikut:
Di antara mereka, jumlah data log dari log pesan dan utas latar belakang sangat besar. Jika semua log dicetak dalam satu file dan menggunakan file tail -f log.log , Anda akan menemukan bahwa log sedang menggulir dengan cepat, dan Anda tidak dapat melihat atau bahkan menemukan SQL tertentu atau log akses layanan.
Solusinya adalah mengklasifikasikan dan mengeluarkan log yang berbeda sehingga log timbal balik tidak saling mempengaruhi. Akses ke log oleh antarmuka yang sangat penting dapat dengan mudah menemukan dan memecahkan masalah.
Langkah 1: Konfigurasikan di log4j.properties
Posting pertama semua konfigurasi log4j.properties saya sendiri:
log4j.rootlogger = info, konsol, file log4j.applog.console = net.czt.log.asyncconsoleAppenderLog4j.appender.console.layout = org.apache.log4j.patternlayoutlog4j.applents.console.layout.conversion.patternlayoutlog4j.applent %-17c {2} (%13f:%l)%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id} - %m %nlog4j.Appender.console.bufferSize = 10000GOG4J.Appender.console.encoding = UTF-8 LOG4J.Appender.file = org.apache.log4j.rollingfileAppenderLog4j.Appender.file.file =/home/work/apache-tomcat-6.0.39/log/crazyant.loglog4j.applent.file.maxb ACKUPINDEX = 5LOG4J.Appender.File.MaxFileSize = 1Gblog4j.Appender.file.layout = org.apache.log4j.patternlayoutlog4j.appender.file.layout.conversionPattern = [%-5p] crazyant-web%d {yyyy-mm-dd hh: mm: ss, sss}%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id {server_name} Metode:%l%n%m%nlog4j.Appender.file.bufferSize = 10000LOG4J.Appender.file.encoding = UTF-8 LOG4J.LOGGER.NET.CZT.Crazyant.msg = debug, messagelog4j.additivity.net.czt.crazyant.msg = falselog4j.Appender.message = org.apache.log4j.rollingfileAppenderlog4j.appling.message.file =/home/work/apache-tomcat-6.0.39/log usia.append = truelog4j.appender.message.maxfileSize = 1gblog4j.appender.message.maxbackupIndex = 5log4j.applog.message.layout = org.apache.log4j.patternLayOutLog4j.applent.message.layout HH: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.Appender.message.encoding = utf-8 log4j.logger.net.czt.crazyant.async.service = debug, asynclog4j.additivity.net.czt.crazyant.async.service = falselog4j.Appender.async = org.apache.log4j.rollingfileAppenderLog4j.appender.async.file =/home/work/work/apache-tomcat-6.aPender R.Async.Append = truelog4j.Appender.async.maxFilesize = 1gblog4j.Appender.async.maxbackupIndex = 5Log4j.Appender.async.layout = org.apache.log4j.patternlayoutlog4j.applend.aSync.async.apache.log4j.patternLayoutLog4j.applend.aSync.async.apache HH: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.Appender.async.encoding = utf-8 log4j.logger.net.czt.orm.mybatis.sqlmonitorm = debug, menunjukkanqllog4j.additivity.net.czt.orm.mybatis.sqlmonitormanager = falselog4j.logger.net.czt.transaction.interceptor.smarttransactioninterceptor = debug, showqllog4j.additivity.net.czt.transaction.interceptor.smarttransactionInterceptor = falselog4j.appender.showsql = org.apache.log4j.rollingfileAppenderLog4j.Appender.showsql.file =/home/work/apachepender oG4J.Appender.showsql.append = truelog4j.appender.showsql.maxfileSize = 1Gblog4j.Appender.showsql.maxbackupIndex = 5log4j .Appender.showsql.layout = org.apache.log4j.patternlayoutlog4j.appender.showsql.layout.conversionPattern =%d {yyyy-mm-dd HH: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.Appender.showsql.encoding = UTF-8 LOG4J.LOGGER.NET.CZT.Crazy.Service = debug, servicelog4j.additivity.net.czt.crazyant.service=falselog4j.appender.service=org.apache.log4j.RollingFileAppenderlog4j.appender.service.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_service.loglog4j.appender.se rvice.append = truelog4j.Appender.service.maxfilesize = 1gblog4j.Appender.service.maxbackupindex = 5Log4j.Appender.service.layout = org.apache.log4j.patternlayoutlog4j.applay.service.lay HH: mm: ss} [%-5p] [%c {1}] [%t]-%m%nlog4j.Appender.service.encoding = UTF-8Di bawah file konfigurasi, Anda dapat dengan mudah melihat bahwa i output pesan (pesan), async (backend thread), showQL (log basis data), dan layanan (panggilan antarmuka) ke masing -masing file log yang berbeda.
Beberapa penjelasan ini:
log4j.rootLogger=INFO, console, file
Log4j memiliki konsep rootlogger dan pencatat biasa. Secara default, kita hanya membutuhkan rootlogger, yaitu, semua log hanya akan menjadi output ke file log ini.
Lihatlah konfigurasi logger normal (mengambil layanan log antarmuka sebagai contoh):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
" net.czt.crazyant.service " dalam kalimat ini menunjukkan jalur lengkap paket yang berlaku dalam konfigurasi log logger normal
Layanan warna menunjukkan nama logger biasa
2. log4j.additivity.net.czt.crazyant.service=false
" net.czt.crazyant.service " di dalamnya sama dengan yang di atas, menunjukkan paket yang ditargetkan oleh item konfigurasi.
Arti konfigurasi dalam kalimat ini adalah tidak mengeluarkan log paket ke log rootlogger, tetapi hanya menghasilkan log ke log yang Anda konfigurasi;
3. log4j.appender.service=org.apache.log4j.RollingFileAppender , dan item konfigurasi di bawah bagian konfigurasi ini
String "layanan" di sini sama dengan "layanan" dari item konfigurasi pertama di atas, menunjukkan konfigurasi logger biasa;
Item konfigurasi di bawah ini sama dengan rootlogger, menunjukkan file output setiap hari, pengkodean UTF8, aturan sharding, mode output untuk setiap baris, dll.
Masalah yang saya temui adalah bahwa setelah log4j.properties di atas dikonfigurasi, saya menemukan bahwa setiap file log dibuat, tetapi tidak ada konten di dalamnya. Mengapa ini? Mari kita lihat hal kedua yang Anda perhatikan di bawah ini;
Langkah 2: Saat mengeluarkan log, Anda perlu mengatur kelas spesifik yang sesuai dengan objek log.
Apa artinya? Dalam item konfigurasi di atas, ada string paket " net.czt.crazyant.service ". Jadi mari kita pikirkan sendiri, bagaimana log4j output logger log dalam paket yang berbeda ke file yang berbeda? Pikirkan tentang itu, ada dua metode:
1. Gunakan metode intercepter atau AOP, log4j mendeteksi output log dengan sendirinya. Ketika mendeteksi paket mana log dihasilkan, itu akan menjadi output ke file yang sesuai;
2. Pengguna melewati parameter kelas, log4j memperoleh paket kelas yang sesuai, dan menggunakan ini sebagai dasar untuk menemukan file log yang berbeda;
Melihat kode, jelas bahwa Log4j menggunakan metode sederhana dan langsung yang terakhir:
impor org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; kelas publik myclassimpl mengimplementasikan myclass { / ** * lOger * / private static final log logger = logfactory.getLog (myclassimpl.class); / ** * func saya */ public void myfunc () {logger.info ("Metode panggilan myfunc."); }} Dalam logger = LogFactory.getLog(MyClassImpl.class) , parameter kelas menggunakan logger dilewatkan, dan alamat paket yang dicerminkan kelas adalah alamat paket yang digunakan oleh log4j untuk mengeluarkan log.
Pendekatan ini juga memiliki fitur yang kuat, yang memfasilitasi klasifikasi log logis. Misalnya, banyak kode bukan milik paket, tetapi mereka termasuk secara logis bersama. Misalnya, pemrosesan pesan bukan hanya antarmuka yang memanggil paket layanan, tetapi juga dapat memanggil operasi pengiriman MSG. Jika Anda ingin mengeluarkan beberapa log dalam paket MSG ke Layanan, maka ketika Logger MSG diinisialisasi, kelas layanan baru saja dilewati.
Atau untuk semua log dari kelas tertentu, semua objek Logger mereka dapat dari instance objek yang dienkapsulasi tunggal, dan hanya ada satu parameter yang dilewatkan dalam instance objek tunggal ini, yang dapat digunakan untuk mengidentifikasi klasifikasi logis ini.
Meringkaskan
Dalam Log4j.properties , output terpisah dari log paket atau kelas tertentu didukung, tetapi juga mensyaratkan bahwa inisialisasi logger dalam kode dapat sesuai dengan paket dalam konfigurasi log.
Oke, di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini akan membantu untuk belajar atau bekerja semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.