1.1 Pendahuluan
Memalukan untuk mengatakannya. Baru -baru ini, perusahaan dikirim ke perusahaan klien untuk mewawancarai posisi pengembangan outsourcing. Saya awalnya menyiapkan beberapa pertanyaan wawancara terkait untuk Redis, RabbitMQ, SSM Frameworks, dan beberapa ulasan proyek yang telah saya lakukan. Saya pergi ke wawancara dengan percaya diri. Akibatnya, seseorang bertanya apa sistem log yang digunakan dalam proyek baru -baru ini segera setelah saya muncul? Bagaimana level log dikonfigurasi? Saya bingung saat itu. Saya biasanya merawatnya oleh manajer proyek. Saya baru saja mencari di internet dan menempelkannya dan tidak apa -apa. Setelah saya selesai berbicara, pewawancara memberi saya pandangan yang dalam. Pada saat itu, saya merasa malu ...
1.2 Ceritakan lebih sedikit tentang gosip dan ceritakan kisah pengembangan log (jika Anda sudah tahu, Anda dapat melewatkannya dan hanya melihat konfigurasi 1,3 log)
Untuk memiliki pemahaman mendalam tentang implementasi teknologi log, saya pribadi merekomendasikan untuk membaca: logback + slf4j. Adapun konfigurasi log, lebih baik memahami log4j, karena sebagian besar proyek saat ini menggunakan log4j. Oke, mari kita mulai dengan kisah pengembangan log:
Pada tahun 1999, komunitas open source Apache merilis LOG4J, yang menyebabkan sensasi di seluruh dunia program. Sejak itu, ini telah menjadi standar untuk penebangan dan telah banyak digunakan oleh programmer Java. Kemudian, Sun juga merilis mekanisme penebangan (java.util.logging, selanjutnya disebut sebagai Jul) di JDK Versi 1.4, tetapi mekanismenya belum diakui oleh publik, yang benar -benar menyedihkan. Segera Apache meluncurkan kerangka log logging commons (yang memungkinkan pengembang untuk abstrak metode implementasi log tanpa memperhatikan teknologi log mana yang digunakan. Dalam istilah awam, Anda ingin memanggil Didi di ponsel Anda. Jika Anda berada di Beijing, Anda akan menghubungi Didi dari Beijing, dan di Hong Kong, Anda akan menelepon Didi dari Hong Kong). Kerangka kerja ini tampaknya menghina Sun. Ini dapat secara otomatis menemukan dan memanggil teknologi log di lingkungan saat ini untuk output log. Kerangka log dapat mendukung log4j atau jul. Commons-logging+log4j menjadi kombinasi klasik log Java untuk waktu yang lama setelah itu. Namun, logam commons belum diperbarui untuk sementara waktu. Saya bertanya-tanya apakah desain gogging commons tidak cukup baik, dan lebih sulit untuk mengoptimalkannya. Mengapa Anda mengatakan itu? Karena kerangka logging yang sangat baik berikutnya Slf4j lahir, penulis (Ceki Gülcü) adalah salah satu penulis Log4j. SLF4J-nya lebih elegan dalam desain, dan ia juga menerapkan teknologi logback, yang juga lebih mutakhir daripada log4j. Pada titik ini, situasi di mana sistem log didominasi oleh commons-gogging+log4j telah mulai terguncang, dan berbagai gogging commons+log4j? slf4j+log4j? Slf4j+logback? Kombinasinya sangat memilukan. Yang lebih menakutkan adalah bahwa bos Ceki Gülcü membantu mengoptimalkan log4j, dan sejak itu, ada teknologi logging lain di dunia - log4j2. Apakah ini akan belajar dari Tencent untuk melakukan WeChat dan QQ? Ini benar -benar 666. Oleh karena itu, jika Anda ingin memiliki pemahaman yang mendalam tentang teknologi logging, Anda dapat menemukan informasi yang relevan tentang Logback + SLF4J. Adapun file konfigurasi, saya pikir Anda bisa memahami penjelasan terperinci dari konfigurasi log4j yang saya tulis di bawah ini. Lagi pula, banyak perusahaan sekarang menggunakan Kerangka Log4J.
1.3 Pergi ke topik, konfigurasi log dasar
1. Buat file LOG4J.Properties baru di bawah Paket ClassPath atau Sumber Daya (Proyek Maven). Parameter berikut cukup untuk konfigurasi proyek awal. Untuk konfigurasi yang lebih rinci,
Lanjutkan untuk melihat konfigurasi tingkat log 1.4 Log4J;
#Specifikasi level log dan sumber output melalui root logger#Prioritas output log: debug <info <warny <error <fatal#tentukan level log (info) dari root logger dan alias sumber output (konsol, myFile)#ini definisi ini memungkinkan log untuk menjadi output di konsol dan file, dan hanya output log di atas log4j.rootlogger = info, konsol, myfile ###### Konfigurasikan implementasi spesifik dari konsol sumber output sebagai konsol output ########## Konsol alias sumber output (yaitu, sumber output yang ditentukan oleh root logger)#Kelas implementasi adalah konsoleAppender (konsol output konsol) konsol konsol) pada konsol konsol) konsol konsol) konsol konsol) konsol konsol) konsol konsol) konsol konsol) konsol konsol) konsol) konsol konsol) konsol konsol) konsol konsol) LOG4J.Appender.Console = org.apache.log4j.consoleAppender #Format Converter Untuk menentukan format output log adalah kelas implementasi PatternLayout log4j.appender.console.layout = org.apache.log4j.patternlayout #Definisikan format spesifik dari logon.aperboCOLOT.LOG4J.POTLERLAYOUT #Definisikan spesifik format spesifik output. %-5p [%c.%M()] - %m%n #######Configure the output source myFile specific implementation as file output########## Define the output source alias myFile (that is, the output source defined by the root logger)# The implementation class is RollingFileAppender (file output source) LOG4J.Appender.myfile = org.apache.log4j.rollingfileAppender#Tentukan jalur penyimpanan file log log4j.Appender.myfile.file = src/log/logproperties/log4j.log#tentukan ukuran log log4j.appender.myfile. (Hitung 1 dari 0, yaitu, hingga 3 file di sini) #absent ukuran ini, file yang dihasilkan sebelumnya akan ditimpa log4j.Appender.myfile.maxbackupIndex = 2#Tentukan format output log ke format LOG4j.Appender.myfile.layout = org.apache.apache.apache. LOG4J.Appender.console.layout.conversionPattern =%d%-5p [%c.%m ()] -%m%n ######### output Format Penjelasan #####%D: Titik waktu untuk pencetakan log, format default adalah ISO8601, dan format juga dapat spesifikasi. #Definition adalah sebagai berikut:%d {yyy tahun mm bulan dd hari hh jam mm menit ss detik sss}, dan outputnya adalah: #JanUary 6, 2018 14: 47: 45: 590 #%p: output level, yaitu debug, info, kesalahan, fatal #%-%p: output level, itu adalah debug, info, warn, kesalahan, fatal #%-%p: itu adalah debug, info, warn, kesalahan, fatal #%-%p: yaitu, debug, info, warn, kesalahan, fatal #%-output level, artinya, debug, info, warn, kesalahan, fatal #%-output level, artinya, debug, info, warn, kesalahan, fatal #%-output level, artinya, debug, info, warn, kesalahan, fatal #%-outpu "-" tanda ada di sebelah kanan), Anda dapat belajar darinya satu contoh #%C: nama lengkap kelas di mana log berada #%m: nama metode di mana log berada #%m: informasi log #%n: output A carriage return line break #%l: output Nomor baris dalam kode tersebut dalam kode tersebut dalam kode tersebut dalam kode tersebut dalam kode tersebut dalam kode tersebut dalam kode tersebut dalam Kode2. Log panggilan untuk menguji hasil konfigurasi.
impor org.apache.log4j.logManager; import org.apache.log4j.logger; impor org.apache.log4j.propertyconfigurator; kelas publik logproperterestest {public static Main (string [] args) { /*parse file konfigurasi di bawah non-classpath string non-Classpath) log4jPath = system.getProperty ("user.dir")+"// src // log // logproperties // log4j.properties"; PropertyConfigurator.configure (log4jPath);*/ logger log = logManager.getLogger (logProperterestest.class); log.debug ("debug"); log.info ("informasi"); log.warn ("peringatan"); log.error ("error"); log.fatal ("kesalahan fatal"); }}1.4 Konfigurasi Level Log
Konfigurasi level log dapat dibagi menjadi tiga kategori. Konfigurasi di atas adalah untuk mengonfigurasi level log dari logger induk, kategori kedua adalah untuk mengkonfigurasi level log dari logger sub-kelas, dan kategori ketiga adalah mengkonfigurasi level log sumber output (konsol, file, dll.). Prioritas parsing tingkat log mereka diatur dari rendah ke tinggi. Saya minta maaf karena tidak menjelaskan pernyataan spesifik dengan jelas. Saya harus dapat memahami kasus ini secara langsung!
1. Jika level log dari logger induk (rootlogger) (dengan asumsi itu adalah level info), level log dari logger subclass tidak dikonfigurasi, dan level log dari sumber output tidak dikonfigurasi, sumber output hanya dapat output level info atau lebih tinggi;
2. Jika level log dari logger induk (rootlogger) (dengan asumsi itu adalah level info), level log dari logger sub-kelas (dengan asumsi level debug), dan level log sumber output tidak dikonfigurasi, output sumber output di atas level debug;
3. Jika level log dari logger induk (rootlogger) (dengan asumsi itu adalah level info), level log dari logger subkelas (dengan asumsi bahwa itu adalah level debug), dan level log dari sumber output (dengan asumsi itu adalah level info), sumber output menghasilkan tingkat info atau di atas;
4. Jika level log dari logger induk (rootlogger) (dengan asumsi itu adalah level info), level log dari logger subclass tidak dikonfigurasi, dan level log dari logger subclass dikonfigurasi.
Level log dari sumber output (dengan asumsi itu adalah level debug), maka sumber output menghasilkan tingkat info atau lebih tinggi;
Oleh karena itu, dari kasus di atas kita dapat mengetahui bahwa ada 2 hubungan logis antara logger dan level log keluaran sumber output:
1. Jika sumber output tidak menentukan level log, ia akan mewarisi level log yang paling dekat dengan logger subkelasnya; Jika logger subclass tidak menentukan level log, ia akan mewarisi logger induk yang paling dekat dengan logger induknya.
2. Saat mencetak log, sumber output akan dibandingkan dengan level log yang ditentukan oleh Subclass Logger yang paling dekat dengannya. Jika level yang ditentukan oleh sumber output lebih tinggi dari logger subkelas, log akan output sesuai dengan level log yang ditentukan oleh sumber output, dan sebaliknya.
Oleh karena itu, dalam proyek, Anda dapat mengonfigurasi level log sesuai dengan metode konfigurasi harian:
#Control Level log dari logger induk adalah info. By default, only logs above the info level are output under all modules log4j.rootLogger=info, console#Console#Control the log level of a module separately to error, and logs are output only when an exception occurs log4j.logger.log.logProperties=error#Control the log level of a class separately to debug, convenient to output debug information LOG4J.LOGGER.LOG.LOGPROPERTIES.LOGPROPERTIESS = DEBUG ########################################################################### ####################################################### ####################################################### ####################################################### #Specifikasi level log dari sumber output saat ini. Dengan konfigurasi sebelumnya, Anda tidak perlu mengonfigurasi item ini #log4j.Appender.console.threshold = info #Tentukan format output log: format fleksibel log4j.appender.console.layout = org.apache.log4j.patternLayout #concon dari format spesifik log4j.apache.apache. [%c.%m ()] -%m%n
1.5 Kesimpulan
Pada titik ini, saya yakin Anda memiliki pemahaman dasar tentang konfigurasi log. Ada banyak hal dalam artikel yang mungkin salah, dan semua pahlawan dipersilakan untuk menunjukkannya. Saya menulis sebuah artikel untuk meringkasnya agar dapat sangat memahami konfigurasi teknologi ini, sehingga saya akan memiliki pemahaman yang lebih dalam tentang hal itu.