Halo, orang Khabrovit terkasih.
Materi yang disajikan dalam artikel ini ditujukan untuk pemula dan, mungkin, ini akan menghemat waktu beberapa jam untuk mencari di StackOverFlow dan situs lain untuk mendapatkan sistem logging yang nyaman yang dengan sendirinya akan memahami di mana harus log - ke konsol, file atau logstash.
Pada awal proyek, tugas selalu muncul dari mengkonfigurasi logging dengan benar, sedangkan pada lingkungan lokal log harus ditampilkan di konsol dan di file untuk kenyamanan selama debugging, dan itu sangat tidak diinginkan untuk mengeluarkan log ke konsol di server jarak jauh, tetapi sebaliknya mereka harus ditulis ke file logstash atau dalam database. Dan jika Anda memiliki Windows secara lokal dan pada mesin Linux jarak jauh, maka alamat lokasi file log ini berbeda.
Dengan demikian, ada banyak situasi di mana Anda harus terus memperbaiki konfigurasi sistem logging dengan tangan Anda, tergantung pada keadaan eksternal.
Saya bosan terus-menerus mengingat dan mengomentari appenders, dan saya mengembangkan cara untuk mengkonfigurasi Log4j2 sehingga, tergantung pada profil Maven yang dipilih, hanya appenders yang tepat yang secara otomatis dihidupkan.
Di bawah ini adalah instruksi untuk menyiapkan proyek menggunakan Spring Boot + Maven + Log4j2, yang hasilnya adalah sistem logging yang dikonfigurasi dan dua appenders: CONSOLE dan SOCKET.
Pertama-tama, kami akan membuat perubahan pada konfigurasi Maven (pom.xml):
Dalam variabel di tingkat pom.xml keseluruhan, tambahkan alamat host untuk logstash-appender:
<properties> <logstash.host>logstashcsm.example.ru</logstash.host> </properties>
Tambahkan dependensi yang diperlukan untuk pekerjaan:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies>
Perhatikan bahwa kami mengecualikan dependensi spring-boot-starter-logging dari spring-boot-starter-web.
Siapkan profil Maven untuk secara dinamis mengelola appenders yang terhubung. Pada tingkat setiap profil, kami menetapkan variabel logstash.port, logger.console.tresholdFilter, logger.socket.tresholdFilter
.
<profiles> <profile> <id>local</id> <properties> <logstash.port>10000</logstash.port> <logger.console.tresholdFilter>ALL</logger.console.tresholdFilter> <logger.socket.tresholdFilter>OFF</logger.socket.tresholdFilter> </properties> </profile> <profile> <id>dev</id> <properties> <logstash.port>10001</logstash.port> <logger.console.tresholdFilter>OFF</logger.console.tresholdFilter> <logger.socket.tresholdFilter>ALL</logger.socket.tresholdFilter> </properties> </profile> </profiles>
logstash.port - port tempat log harus dikirim.
logger.console.tresholdFilter - nilainya menentukan tingkat penyaringan log yang ditampilkan di konsol. Dalam kasus kami, SEMUA berarti bahwa catatan log dari semua level akan ditampilkan di konsol konsol.
logger.socket.tresholdFilter - nilai menetapkan tingkat penyaringan log yang dikirim ke logstash. OFF - berarti tidak ada catatan yang dikirim ke appender ini yang akan berlalu.
Sekarang kita perlu membuat perubahan pada application.properties sehingga dari file Log4j2.xml kita dapat mengakses nilai variabel yang ditentukan dalam pom.xml:
logstash.host=@logstash.host@
logstash.port=@logstash.port@
logger.console.tresholdFilter=@logger.console.tresholdFilter@
logger.socket.tresholdFilter=@logger.socket.tresholdFilter@
Dan akhirnya, kami mengkonfigurasi konfigurasi Log4j2 itu sendiri dalam file log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="socket.host">${bundle:application:logstash.host}</Property> <Property name="socket.port">${bundle:application:logstash.port}</Property> <Property name="console.thresholdFilter">${bundle:application:logger.console.tresholdFilter}</Property> <Property name="socket.thresholdFilter">${bundle:application:logger.socket.tresholdFilter}</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <ThresholdFilter level="${console.thresholdFilter}"/> <PatternLayout pattern="%d %-5p [%t] %c{10} - %m%n"/> </Console> <Socket name="SOCKET" host="${socket.host}" port="${socket.port}" immediateFlush="true"> <ThresholdFilter level="${socket.thresholdFilter}"/> <JSONLayout eventEol="true" compact="true"/> </Socket> <Async name="ASYNC"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="SOCKET"/> </Async> </Appenders> <Loggers> <Logger name="ru.example" level="debug" additivity="false"> <AppenderRef ref="ASYNC"/> </Logger> <Root level="error"> <AppenderRef ref="ASYNC"/> </Root> </Loggers> </Configuration>
Sekarang, untuk memanggil logger di kelas Anda, Anda harus membuat instance dari itu:
private static Logger logger = LoggerFactory.getLogger(YourClass.class);
dan berbalik kepadanya:
logger.info(" ");
Itu saja. Sekarang logging akan bekerja dengan mempertimbangkan profil Maven yang aktif dalam proyek.
Harap dicatat bahwa dalam daftar file log4j2.xml
, dua logger ru.example
- ru.example
dan root
, dan mereka memiliki berbagai tingkat pencatatan peristiwa. Yang pertama akan bekerja pada semua acara yang dihasilkan oleh kelas-kelas dari ru.example.*
Paket dan ru.example.*
semuanya dari tingkat DEBUG, dan root
logger akan merekam peristiwa dari benar-benar semua kelas, tetapi dari tingkat KESALAHAN.
Pada saat yang sama, agar entri tidak diduplikasi dalam log, pengaturan additivity="false"
digunakan.