Menetapkan Tahap Log pada Spring Boot semasa Menguji

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menunjukkan cara menetapkan tahap log ketika menjalankan ujian untuk aplikasi Spring Boot .

Walaupun kita kebanyakan dapat mengabaikan log semasa ujian kita lulus, memilih tahap log yang tepat boleh menjadi penting sekiranya ada keperluan untuk mendiagnosis ujian yang gagal .

2. Kepentingan Tahap Log

Mengkonfigurasi tahap log dengan betul dapat menjimatkan banyak masa.

Sebagai contoh, jika ujian gagal pada pelayan CI tetapi meneruskan mesin pengembangan kami, kami tidak akan dapat mendiagnosis ujian yang gagal kecuali kami mempunyai output log yang mencukupi . Di sisi lain, jika kita terlalu banyak mencatat log, mungkin lebih sukar untuk mencari maklumat yang berguna.

Untuk mencapai jumlah perincian yang tepat, kita dapat menyesuaikan tahap pembalakan pakej aplikasi kita. Sekiranya kami mendapati bahawa pakej Java lebih penting untuk ujian kami, kami dapat memberikannya tahap yang lebih rendah, seperti DEBUG . Begitu juga, untuk mengelakkan terlalu banyak bunyi dalam log kami, kami dapat mengkonfigurasi tahap yang lebih tinggi, katakan INFO atau KESALAHAN, untuk pakej yang kurang penting.

Mari kita terokai pelbagai cara menetapkan tahap pembalakan.

3. Tetapan Log di aplikasi.properties

Sekiranya kita ingin mengubah tahap log dalam ujian kita, ada harta yang boleh kita tetapkan dalam src / test / resources / application.properties :

logging.level.com.baeldung.testloglevel=DEBUG

Properti ini akan menetapkan tahap log khusus untuk pakej com.baeldung.testloglevel .

Begitu juga, kita boleh mengubah tahap pembalakan untuk semua pakej dengan menetapkan tahap log root :

logging.level.root=INFO

Sekarang, mari kita cuba tetapan pembalakan kami dengan menambahkan titik akhir REST yang menulis beberapa log:

@RestController public class TestLogLevelController { private static final Logger LOG = LoggerFactory.getLogger(TestLogLevelController.class); @Autowired private OtherComponent otherComponent; @GetMapping("/testLogLevel") public String testLogLevel() { LOG.trace("This is a TRACE log"); LOG.debug("This is a DEBUG log"); LOG.info("This is an INFO log"); LOG.error("This is an ERROR log"); otherComponent.processData(); return "Added some log output to console..."; } }

Seperti yang dijangkakan, jika kita menyebut titik akhir ini dalam ujian kita , kita akan dapat melihat log DEBUG dari TestLogLevelController :

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log 2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log 2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package 

Menetapkan tahap log seperti ini agak mudah, dan kita pasti harus melakukannya dengan cara ini sekiranya ujian kita diberi penjelasan dengan @SpringBootTest . Namun, jika kita tidak menggunakan anotasi itu, kita harus mengkonfigurasi tahap log dengan cara yang berbeza.

3.1. Tetapan Pembalakan Berasaskan Profil

Walaupun meletakkan tetapan ke src / test / application.properties akan berfungsi dalam kebanyakan situasi, mungkin ada kes di mana kita ingin mempunyai tetapan yang berbeza untuk satu ujian atau sekumpulan ujian .

Sekiranya demikian, kita boleh menambahkan profil Spring ke ujian kita dengan menggunakan anotasi ActiveProfiles :

@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = TestLogLevelApplication.class) @EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class) @ActiveProfiles("logging-test") public class TestLogLevelWithProfileIntegrationTest { // ... }

Tetapan pembalakan kami kemudian akan berada dalam fail aplikasi-logging-test.properties khas dalam src / test / resources :

logging.level.com.baeldung.testloglevel=TRACE logging.level.root=ERROR

Sekiranya kami memanggil TestLogLevelController dari ujian kami dengan tetapan yang dijelaskan, kami sekarang akan melihat log TRACE dari pengawal kami, dan tidak akan ada lagi log INFO dari pakej lain:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log 2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

4. Mengkonfigurasi Log Masuk

Sekiranya kita menggunakan Logback, yang digunakan secara lalai dalam Spring Boot, kita dapat menetapkan tahap log dalam logback-test.xml file dalam src / test / resources

    %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n        

Contoh di atas menunjukkan cara menetapkan tahap log dalam konfigurasi Logback kami untuk ujian. Tahap log root ditetapkan ke INFO dan tahap log untuk pakej com.baeldung.testloglevel kami ditetapkan ke DEBUG .

Sekali lagi, mari kita periksa output setelah menerapkan tetapan dari atas:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log 2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log 2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package 

4.1. Konfigurasi Logback berdasarkan profil

Cara lain untuk menetapkan konfigurasi khusus profil untuk ujian kami adalah dengan menetapkan harta logging.config di application.properties untuk profil kami:

logging.config=classpath:logback-testloglevel.xml

Atau, satu lagi, katakan jika kita ingin mempunyai tatarajah Logback tunggal pada classpath kami, adalah dengan menggunakan springProfile elemen dalam logback.xml :

    %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n             

Sekarang, jika kita memanggil TestLogLevelController dalam ujian kami dengan profil logback-test1 , kami akan mendapat output berikut:

2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log 2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package 

Sebaliknya, jika kita menukar profil menjadi logback-test2 , outputnya adalah:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log 2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log 2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package 

5. Alternatif Log4J

Sebagai alternatif, jika kita menggunakan Log4J2, kita dapat menetapkan tahap log dalam fail log4j2-spring.xml dalam src / test / resources:

Kami dapat menetapkan jalan konfigurasi Log4J kami dengan menetapkan harta logging.config di application.properties :

logging.config=classpath:log4j-testloglevel.xml

Akhirnya, mari kita periksa output setelah menerapkan tetapan di atas:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log 2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log 2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package 2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package 

6. Kesimpulannya

Dalam artikel ini, kami telah mempelajari cara menetapkan tahap log ketika menguji aplikasi Spring Boot . Kami meneroka beberapa cara untuk mengkonfigurasinya.

Menetapkan tahap log dalam aplikasi Spring Boot.properties memperlihatkan dirinya sebagai yang paling mudah, terutama ketika kita menggunakan anotasi @SpringBootTest .

Seperti biasa, kod sumber untuk contoh ini sudah habis di GitHub.