Selama operasi proyek, seringkali perlu untuk melakukan debugging fungsional dan melacak dan merekam perilaku pengguna. Beberapa orang terbiasa menggunakan System.out, tetapi ini tidak disarankan. Ini hanya mudah digunakan tetapi tidak mudah dipelihara dan tidak memiliki skalabilitas. Dibandingkan dengan log4j, log4j dapat mengontrol tujuan, format output dan tingkat informasi log, dll., Sehingga kita dapat mengontrol proses pembuatan log lebih hati -hati.
LOG4J2 adalah peningkatan ke log4J1, dengan peningkatan yang signifikan dalam kinerja dan fungsionalitas, termasuk throughput yang ditingkatkan di multithreads, dukungan untuk placeholder, pemuatan ulang file konfigurasi otomatis, dll.
1. Pendahuluan
1. Unduh paket jar
pox.xml
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version> 2.10.0 </version> </dependency> </dependencies>
2. File Konfigurasi
LOG4J berisi empat implementasi pabrik konfigurasi: JSON, YAML, Properties, dan XML. Artikel ini memperkenalkan metode XML yang umum digunakan.
Log4j memiliki kemampuan untuk secara otomatis mengonfigurasi dirinya selama inisialisasi. Saat log4j dimulai, itu akan menemukan semua file yang sesuai dengan nama di bawah ClassPath, dengan urutan prioritas: log4j2-test.properties> log4j2-test.xml> log4j2.properties> log4j2.xml
3. Contoh sederhana
Konfigurasi XML:
<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <level root = "info"> <appenderref ref = "console"/> </root> </toggers> </donfiguration> Kode Java:
Private Static Final Logger Logger = LogManager.getLogger (myapp.class); @Test public void testLog4j () {logger.info ("Hello World!"); }}Informasi konsol
22: 17: 47.146 [Utama] Info MyApp - Hello World!
2. PENDAHULUAN MODUL
<Configuration>
| milik | menggambarkan |
| MonitorInterval | Jika file dimodifikasi, konfigurasi akan dimuat ulang setelah waktu yang ditentukan. Unit detik, nilai minimum adalah 5 |
| paket | Daftar nama paket yang dipisahkan secara koma yang digunakan untuk mencari plug-in, seperti filter khusus, appenders, dll. Plugin hanya akan dimuat satu kali, jadi Anda harus memulai kembali proyek jika ingin berlaku setelah modifikasi. |
| status | Level log internal, mengatur nilai ke debug dapat dengan jelas melihat seluruh aliran log pada konsol. Logger yang digunakan adalah org.apache.logging.log4j.core.logger |
| ketat | Format XML yang ketat diperbolehkan. Konfigurasi JSON tidak didukung |
| verbose | Aktifkan informasi diagnostik saat memuat plugin |
<pencani>
LOG4J memungkinkan permintaan log dicetak ke beberapa tujuan. Dalam bahasa Log4J, tujuan output disebut Appender. Saat ini, appenders ada di konsol, file, server soket jarak jauh, Apache Flume, JMS, Remote Unix Syslog Daemon dan berbagai API database. Berikut ini memperkenalkan beberapa appender yang lebih umum digunakan. Jika Anda perlu tahu lebih banyak, Anda dapat memeriksanya di situs web resmi.
1. ConsoleAppender
Output ke konsol, <sonsole>
Nama Parameter | jenis | menggambarkan |
menyaring | Menyaring | Menyaring |
tata letak | Tata letak | Format output log |
Mengikuti | Boolean | |
langsung | Boolean | |
nama | Rangkaian | Nama Appender |
IgnoreExceptions | Boolean | Default true, abaikan pengecualian tulis |
target | Rangkaian | System_out atau System_err, default adalah System_out |
2. FileAppender
Output ke File, <FILE>
parameter | jenis | menggambarkan |
|---|---|---|
menambahkan | Boolean | Standarnya benar, dan catatan baru akan ditambahkan ke akhir file |
Bufferedo | Boolean | Standarnya benar, menggunakan buffer dapat secara signifikan meningkatkan kinerja |
Buffersize | int | Ketika bufferedo benar, ukuran buffer properti ini adalah 8192 byte secara default. |
createondemand | Boolean | Appender membuat file sesuai permintaan. Appender akan membuat file ini hanya ketika acara log melewati semua filter dan dialihkan ke appender. Nilai defaultnya salah |
menyaring | Menyaring | Filter untuk menentukan apakah acara tersebut harus ditangani oleh appender ini. Beberapa filter dapat digunakan dengan filter komposit |
nama file | Rangkaian | Nama file yang akan ditulis. Jika file atau direktori induknya tidak ada, mereka akan dibuat |
segeraflush | Boolean | Secara default true, akan ada penyegaran setelah masing -masing menulis. Ini akan memastikan bahwa data buffer ditulis ke disk, tetapi dapat memengaruhi kinerja. |
tata letak | Tata letak | Format log |
mengunci | Boolean | Kunci file, false default |
nama | Rangkaian | Nama Appender |
IgnoreExceptions | Boolean | Default true, abaikan pengecualian tulis |
Filepermissions | Rangkaian | Tentukan izin file Contoh: RW ------ atau RW-RW-RW- dll ... |
pemilik file | Rangkaian | Tentukan pemilik file |
FileGroup | Rangkaian | Tentukan grup file |
3. JDBCAPENDER
JDBCappender menggunakan JDBC standar untuk menulis acara log ke dalam tabel database relasional. Dapat dikonfigurasi untuk mendapatkan koneksi JDBC menggunakan sumber data JNDI atau metode pabrik khusus. Terlepas dari metode ini, itu harus didukung oleh kumpulan koneksi.
Kalau tidak, kinerja logging akan sangat terpengaruh.
Jika driver JDBC yang dikonfigurasi mendukung pernyataan batch dan mengkonfigurasi ukuran buffer ke angka positif, acara log akan dikeluarkan.
(1) <jdbc>
parameter | jenis | menggambarkan |
|---|---|---|
nama | Rangkaian | Harus, nama appender |
IgnoreExceptions | Boolean | Default true, abaikan pengecualian acara log |
menyaring | Menyaring | Menyaring |
Buffersize | int | Jika bilangan bulat lebih besar dari 0, ini akan menyebabkan appender buffer acara log dan menyegarkan data tulis saat buffer mencapai ukuran itu |
ConnectionSource | ConnectionSource | Harus diambil koneksi basis data |
Tablename | Rangkaian | Diperlukan, masukkan nama tabel data dari acara log |
Columnconfigs | Columnconfig [] | Harus, bidang yang perlu dimasukkan ke dalam database terdiri dari beberapa elemen <Olmol> |
Columnmappings | Columnmapping [] | Diperlukan, konfigurasi pemetaan lapangan |
(2) Gunakan <DataSource> untuk mendapatkan koneksi JDBC, hanya JNDI yang tercantum di sini:
| parameter | jenis | menggambarkan |
|---|---|---|
| Jndiname | Rangkaian | Diperlukan, jika JNDI yang dikonfigurasi adalah JDBC/LoggingDatabase, nilainya di sini adalah Java: comp/env/jdbc/loggingDatabase. Sumber data harus didukung oleh kumpulan koneksi; Kalau tidak, logging akan sangat lambat. |
(3) Gunakan <Olmol> untuk menentukan kolom mana yang akan ditulis ke tabel dan cara menulisnya. Tidak memiliki kerentanan injeksi SQL.
| parameter | jenis | menggambarkan |
|---|---|---|
| nama | Rangkaian | Diperlukan, Nama Bidang Tabel |
| pola | Rangkaian | Sisipkan nilai menggunakan Mode PatternLayout. CATATAN: Dalam elemen kolom yang sama, hanya satu dari tiga atribut pola, literal, dan isEventTimestamp dapat ada dalam elemen kolom yang sama. |
| harfiah | Rangkaian | Nilai ini akan secara langsung dimasukkan dalam pernyataan SQL dan dieksekusi, misalnya: Fungsi rand () akan menghasilkan angka acak, mirip dengan $ {} di Myibats |
| isEventTimestamp | Boolean | Apakah format waktu java.sql.types.timestamp |
| isunicode | Boolean | Properti ini diabaikan kecuali suatu pola ditentukan. Jika benar, nilainya akan dimasukkan ke dalam unicode. Kalau tidak, nilainya akan dimasukkan ke dalam non-unicode. |
| isclob | Boolean | Properti ini diabaikan kecuali suatu pola ditentukan. Jika benar, nilainya akan dimasukkan ke dalam clob, jika tidak varchar, nvarchar akan dimasukkan ke dalam |
Contoh:
<? XML Versi = "1.0" encoding = "utf-8"?> <status konfigurasi = "error"> <appenders> <jdbc name = "databaseAppender" tableName = "dbo.application_log"> <DataSource jndiname = "java:/comp/comp/jdbc/jdbc (" "" "java:/comp/comp/jdbc/jdbc/" "" "" "" "" JdBC/JDBC " isEventTimestamp = "true" /> <name kolom = "level" pola = "%level" /> <nama kolom = "logger" pola = "%logger" /> <nama kolom = "pesan" pola = "%pesan" /> <nama kolom = "exception" Pattern = "%ex {full}" /% Ref = "DataBaseAppender"/> </soot> </toggers> </an konfigurasi><polatlayout>
(1) tanggal, %d/ %tanggal
Pola | Contoh |
|---|---|
%d {default} | 2012-11-02 14: 34: 02.781 |
%d {iso8601} | 2012-11-02T14: 34: 02.781 |
%d {iso8601_basic} | 20121102t143402.781 |
%d {absolute} | 14: 34: 02.781 |
%d {date} | 02 Nov 2012 14: 34: 02.781 |
%d {compact} | 20121102143402781 |
%d {hh: mm: ss, ss} | 14: 34: 02.781 |
%d {dd mmm yyy hh: mm: ss, ss} | 02 Nov 2012 14: 34: 02.781 |
%d {hh: mm: ss} {gmt+0} | 18:34:02 |
%d {unix} | 1351866842 |
%d {unix_millis} | 1351866842781 |
Tentu saja Anda juga dapat menyesuaikan format, seperti %d {yyyy-mm-dd hh: mm: ss}
(2) Logger, %C/ %Logger
Pola konversi | Nama logger | hasil |
|---|---|---|
%c {1} | org.apache.commons.foo | Foo |
%c {2} | org.apache.commons.foo | commons.foo |
%c {10} | org.apache.commons.foo | org.apache.commons.foo |
%c {-1} | org.apache.commons.foo | Apache.Commons.foo |
%c {-2} | org.apache.commons.foo | commons.foo |
%c {-10} | org.apache.commons.foo | org.apache.commons.foo |
%c {1.} | org.apache.commons.foo | Oacfoo |
%c {1.1. ~. ~} | org.apache.commons.test.foo | oa ~. ~ .foo |
%C{.} | org.apache.commons.test.foo | .... foo |
{?} - Kapan ? adalah bilangan bulat positif, itu berarti bahwa bagian n diambil dari kanan, dan bilangan bulat negatif berarti bahwa bagian n dihapus dari kiri. Jadi mengapa %c {-10} adalah nama lengkapnya, saya tidak tahu. Selamat datang untuk meninggalkan pesan
(3) Informasi log,%m/%msg/%pesan
(4) Level log, %level
<nilter>
LOG4J2 dilengkapi dengan berbagai filter untuk penggunaan langsung, dan kami juga dapat mendefinisikan filter sendiri:
Myfilter.java
import org.apache.logging.log4j.Level;import org.apache.logging.log4j.Marker;import org.apache.logging.log4j.ThreadContext;import org.apache.logging.log4j.core.LogEvent;import org.apache.logging.log4j.core.Logger;import org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.config.plugins.pluginfactory; impor org.apache.logging.log4j.core.filter.abstractfilter; org.apache.logging.log4j.message.message; @plugin (name = "myfilter", Category = "core", elementType = "filter", printObject = true) public final class myFilter memperluas abstrak abstrak {level tingkat akhir pribadi; private myfilter (level level, hasil onMatch, hasil onmishatch) {super (onMatch, onmishatch); this.level = level; } filter hasil publik (logger logger, level level, penanda marker, string msg, objek [] params) {return filter (level); } Filter Hasil Publik (Logger Logger, Level Level, Marker Marker, Object Msg, Throwable T) {Return Filter (Level); } Filter Hasil Publik (Logger Logger, Level Level, Marker Marker, Pesan Msg, Throwable T) {Return Filter (Level); } @Override Public Hasil Filter (LogEvent Event) {return filter (event.getLevel ()); } filter hasil pribadi (level level) { / * * logika bisnis * * / level return.ismorespecificthan (this.level)? Onmatch: OnMishatch; } @Override public string toString () {return level.toString (); } @Pluginfactory public static myfilter createFilter (@pluginattribute (value = "level", defaultString = "error") level, @pluginattribute (value = "onMatch", deFaultString = "netral") hasil onMatch, @pluginattribute (value ", oNMISCH", ONMICHATCH ", ONMISCICH", ONMICCH ", ONMICHATCE", ONMICCH ", ONMISCICH", ONMICCH ", ONMICCH", ONMICCH ", ONMICCH") Myfilter (level, onmatch, onMishatch); }}log4j2.xml
<? xml versi = "1.0" encoding = "UTF-8"?> <status konfigurasi = "warn" monitorInterval = "5" Paket = "paket Anda" verbose = "false" strict = "true"> <appenders> <console name = "console" target = "System_Out" ignoreExceptions = "my-m-pater" my pattern "my PATER" MY POLAT = "System_out" HH: mm: ss} %level %logger {10} - %msg "/> <myfilter level =" info "onMatch =" recept "/> </console> </appenders> <toggers> <root level =" info "> <ampalan embelref =" konsol "/</root> </logigers> </logiger> </konfigurasi> Console>Mengisi kembali:
Dalam aplikasi praktis, kadang -kadang perlu untuk merekam informasi akses pengguna, seperti parameter permintaan, ID pengguna, dll. Di LOG4J1, kami akan menggunakan MDC dan NDC untuk menyimpan informasi konteks aplikasi, sementara LOG4J2 menggunakan ThreadContext untuk mengimplementasikan fungsi MDC dan NDC.
(1) NDC menggunakan mekanisme seperti tumpukan untuk menyimpan informasi konteks, dan utas independen.
Gunakan %x untuk output di PatternLayout, perhatikan bahwa X adalah huruf kecil.
Contoh:
Test.java
ThreadContext.push ("Hello World!");log4j2.xml
<Kolom name = "tip" pola = "%x" />
(2) MDC menggunakan mekanisme seperti peta untuk menyimpan informasi, dan utas independen.
Gunakan %x {UserId} di PatternLayout untuk output, perhatikan bahwa X dikapitalisasi.
Contoh:
Test.java
ThreadContext.put ("userid", "1");log4j2.xml
<Kolom name = "userid" pola = "%x {userid}" />Perhatikan bahwa setelah menggunakannya, hubungi clearAll () untuk menghapus peta konteks dan tumpukan.
API: http://logging.apache.org/log4j/2.x/javadoc.html
Alamat situs web resmi: https://logging.apache.org/log4j/2.x/index.html
Contoh kode di atas dari komponen log proyek log4J2 adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.