Spring Boot: Bagaimana saya bisa mengatur level logging dengan application.properties?

301

Ini pertanyaan yang sangat sederhana, tetapi saya tidak dapat menemukan informasi.
(Mungkin pengetahuan saya tentang kerangka kerja Java sangat kurang)

Bagaimana saya bisa mengatur level logging dengan application.properties?
Dan mencatat lokasi file, dll?

zeodtr
sumber
1
Sebagai catatan, opsi lain adalah mengatur level log sebagai variabel lingkungan, misalnya melalui dasbor heroku. Di Settings-> Config Varsatur logging.level.com.yourpackageke level yang diinginkan (INFO, ERROR, DEBUG).
LukeSolar

Jawaban:

355

Pembaruan: Dimulai dengan Spring Boot v1.2.0.RELEASE, pengaturan dalam application.propertiesatau application.ymlmemang berlaku. Lihat bagian Tingkat Log dari panduan referensi.

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR

Untuk versi Spring Boot sebelumnya, Anda tidak bisa. Anda hanya perlu menggunakan konfigurasi normal untuk kerangka logging Anda (log4j, logback) untuk itu. Tambahkan file konfigurasi yang sesuai ( log4j.xmlatau logback.xml) ke src/main/resourcesdirektori dan konfigurasikan sesuai keinginan Anda.

Anda dapat mengaktifkan debug logging dengan menentukan --debugsaat memulai aplikasi dari baris perintah.

Spring Boot juga menyediakan titik awal yang bagus untuk logback untuk mengkonfigurasi beberapa default, mewarnai dll. File base.xml yang dapat Anda sertakan dalam file logback.xml Anda. (Ini juga disarankan dari logback.xml default di Spring Boot.

<include resource="org/springframework/boot/logging/logback/base.xml"/>     
M. Deinum
sumber
8
Biasanya apa pun yang dapat Anda lakukan pada baris perintah berfungsi di file konfigurasi eksternal. Jadi debug = true akan melakukannya saya pikir. Bendera itu agak istimewa karena logging harus diinisialisasi sangat awal, tetapi saya pikir itu akan berhasil.
Dave Syer
7
BTW sistem logging yang disukai adalah logback, dan itulah yang Anda dapatkan secara default dari starter poms. Jadi logback.xml adalah alat yang paling umum untuk mengkonfigurasi logging dengan cara berbutir halus. Bendera --debug hanya mengaktifkan beberapa saluran Spring logging yang dipilih.
Dave Syer
Tip lain, spring boot meliputi base.xml yang bagus . Yang merupakan titik awal yang bagus. (Lihat jawaban saya yang diperluas).
M. Deinum
@ M.Deinum Sekali lagi terima kasih atas tip Anda! Sekarang saya dapat mengubah level log untuk kode saya sendiri.
zeodtr
2
Sepertinya kita bisa, sekarang. Adapun Spring v4.1.3.RELEASE (dengan Spring Boot v1.2.0.RELEASE), pengaturan dalam application.propertiesatau application.ymlmemang berlaku, seperti dijawab oleh Richard (modulo :atau =masalah --- usus besar tampaknya bekerja untuk saya).
Eric Platon
108

Anda dapat melakukannya menggunakan properti aplikasi Anda.

logging.level.=ERROR-> Setel level logging root ke kesalahan
...
logging.level.=DEBUG-> Setel level logging root ke DEBUG

logging.file=${java.io.tmpdir}/myapp.log-> Setel path file log absolut ke TMPDIR / myapp.log

Serangkaian aplikasi.properti yang waras tentang logging menggunakan profil adalah: properti aplikasi:

spring.application.name=<your app name here>
logging.level.=ERROR
logging.file=${java.io.tmpdir}/${spring.application.name}.log

application-dev.properties:

logging.level.=DEBUG
logging.file=

Ketika Anda mengembangkan di dalam IDE favorit Anda, Anda hanya menambahkan -Dspring.profiles.active=devargumen sebagai VM ke konfigurasi run / debug aplikasi Anda.

Ini akan memberi Anda hanya kesalahan log in produksi dan debug logging selama pengembangan TANPA menulis output ke file log. Ini akan meningkatkan kinerja selama pengembangan (dan menghemat drive SSD beberapa jam operasi;)).

Richard
sumber
1
Tanda '=' untuk penugasan tidak berfungsi. Tugas dilakukan dengan ':' sebagai pemisah. logging.level.:DEBUG
randominstanceOfLivingThing
2
Aneh, saya punya pengaturan ini bekerja di proyek contoh. Tanda '' (spasi), '=' dan ':' diperlakukan sama sebagai pemisah kecuali untuk kasus di mana pemisah digunakan dalam kunci. Apakah Anda yakin kunci Anda tidak mengandung spasi putih?
Richard
1
Dapat mengonfirmasi bahwa ":" berfungsi tetapi "=" diabaikan, Edit: Diucapkan segera, ada spasi antara "=" dan level. semuanya berfungsi sekarang.
Mike R
1
Ini tidak berfungsi dalam pengujian saya dengan spring-boot 1.4.0: logging.level.=DEBUGakan menyebabkan aplikasi gagal untuk memulai, dan mendapatkan kesalahan:java.lang.ClassCircularityError: java/util/logging/LogRecord
Eric Wang
2
Menurut saya logging.level.hanyalah cara pintas sintaksis kenyamanan logging.level.root, yang dapat lebih disukai sebagai (1) kurang rentan menjadi bingung dengan kesalahan ketik, (2) berpotensi lebih eksplisit, dan (3) bekerja dengan =tanda penugasan, yang memberikan konsistensi lebih menyeluruh secara keseluruhan ke file konfigurasi.
Alain BECKER
66

Cara yang tepat untuk mengatur level logging root adalah menggunakan properti logging.level.root. Lihat dokumentasi , yang telah diperbarui sejak pertanyaan ini awalnya ditanyakan.

Contoh:

logging.level.root=WARN
The Gilbert Arenas Dagger
sumber
15

Misalkan aplikasi Anda memiliki nama paket sebagai com.company.myproject. Kemudian Anda dapat mengatur level logging untuk kelas di dalam proyek Anda seperti yang diberikan di bawah ini di file application.properties

logging.level.com.company.myproject = DEBUG

logging.level.org.springframework.web = DEBUGdan logging.level.org.hibernate = DEBUGakan mengatur level logging untuk kelas web framework Spring dan hanya Hibernate.

Untuk mengatur penggunaan lokasi file logging

logging.file = /home/ubuntu/myproject.log

shaunthomas999
sumber
14

Jika Anda menggunakan Spring Boot maka Anda dapat langsung menambahkan properti berikut di application.properties file untuk mengatur level logging, menyesuaikan pola logging, dan menyimpan log dalam file eksternal.

Ini adalah level logging yang berbeda dan urutannya dari minimum << maksimum.

OFF << FATAL << ERROR << PERINGATAN << INFO << DEBUG << TRACE << SEMUA

# To set logs level as per your need.
logging.level.org.springframework = debug
logging.level.tech.hardik = trace

# To store logs to external file
# Here use strictly forward "/" slash for both Windows, Linux or any other os, otherwise, its won't work.      
logging.file=D:/spring_app_log_file.log

# To customize logging pattern.
logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"

Silakan lewati tautan ini untuk menyesuaikan log Anda dengan lebih jelas.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html

Hardik Patel
sumber
Saya tidak tahu mengapa tetapi logging.level.tech.hardik = melacak ini tidak berfungsi dalam kasus saya ketika saya meletakkan logging.level.roo = jejak itu berfungsi
Arvind Kumar
10

Pastikan tip Dave Syer mendapatkan cinta, karena menambahkan debug=trueke application.properties memang akan memungkinkan debug logging.

oravecz
sumber
8

Jika Anda ingin menggunakan kerangka logging yang berbeda, log4j misalnya, saya menemukan pendekatan termudah adalah untuk menonaktifkan penebangan sendiri dan mengimplementasikan sendiri. Dengan begitu saya bisa mengkonfigurasi setiap loglevel dalam satu file, log4j.xml (dalam kasus saya) itu.

Untuk mencapai ini, Anda hanya perlu menambahkan baris-baris itu ke pom.xml Anda:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</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-log4j</artifactId>
</dependency>

Anda mungkin sudah memiliki ketergantungan pertama dan hanya perlu dua lainnya. Harap dicatat, bahwa contoh ini hanya mencakup log4j.
Itu saja, sekarang Anda sudah siap untuk mengkonfigurasi logging untuk boot dalam file konfigurasi log4j Anda!

atrip
sumber
Pengecualian ini berhasil untuk saya. REST Api saya tidak memilih ketergantungan log4j saya dan log4j.properties.
ankitjaininfo
mereka juga memiliki spring-boot-starter-log4j2 sekarang
Kalpesh Soni
4

Anda dapat mencoba mengatur level log ke DEBUG itu akan menampilkan segalanya saat memulai aplikasi

logging.level.root=DEBUG
Ahmed Salem
sumber
3

Untuk catatan: dokumentasi resmi , seperti untuk Spring Boot v1.2.0.RELEASE dan Spring v4.1.3.RELEASE:

Jika satu-satunya perubahan yang perlu Anda lakukan untuk login adalah dengan mengatur level berbagai penebang maka Anda dapat melakukannya di application.properties menggunakan awalan "logging.level", mis.

logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR

Anda juga dapat mengatur lokasi file untuk log (selain konsol) menggunakan "logging.file".

Untuk mengonfigurasi pengaturan sistem logging yang lebih halus, Anda perlu menggunakan format konfigurasi asli yang didukung oleh LoggingSystem yang bersangkutan. Secara default Spring Boot mengambil konfigurasi asli dari lokasi default untuk sistem (misalnya classpath: logback.xml untuk Logback), tetapi Anda dapat mengatur lokasi file konfigurasi menggunakan properti "logging.config".

Eric Platon
sumber
2

Jika Anda ingin mengatur lebih detail, silakan tambahkan nama file log config "logback.xml" atau "logback-spring.xml".

di file application.properties Anda, masukan seperti ini:

logging.config: classpath:logback-spring.xml

di loback-spring.xml, masukan seperti ini:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/base.xml"/>

        <appender name="ROOT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">

            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>

            <file>sys.log</file>

            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">


                <fileNamePattern>${LOG_DIR}/${SYSTEM_NAME}/system.%d{yyyy-MM-dd}.%i.log</fileNamePattern>

                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>500MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>

            <encoder>
                <pattern>%-20(%d{yyy-MM-dd HH:mm:ss.SSS} [%X{requestId}]) %-5level - %logger{80} - %msg%n
                </pattern>
            </encoder>
        </appender>


        <appender name="BUSINESS_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>TRACE</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>

            <file>business.log</file>

            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

                <fileNamePattern>${LOG_DIR}/${SYSTEM_NAME}/business.%d{yyyy-MM-dd}.%i.log</fileNamePattern>

                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>500MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>

            <encoder>
                <pattern>%-20(%d{yyy-MM-dd HH:mm:ss.SSS} [%X{requestId}]) %-5level - %logger{80} - %msg%n
                </pattern>
            </encoder>
        </appender>


        <logger name="{project-package-name}" level="TRACE">
            <appender-ref ref="BUSINESS_APPENDER" />
        </logger>

        <root level="INFO">
            <appender-ref ref="ROOT_APPENDER" />
        </root>

    </configuration>
Sheldon Papa
sumber
2

Jawaban yang ada sangat bagus. Saya hanya ingin berbagi dengan Anda fitur boot musim semi baru yang memungkinkan untuk grup log dan mengatur level logging pada seluruh grup.

Contoh dari dokumen:

  • Buat grup logging
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
  • Tetapkan level logging untuk grup
logging.level.tomcat=TRACE

Ini fitur bagus yang membawa lebih banyak fleksibilitas.

Martin Choraine
sumber
2

Dalam konfigurasi saya saat ini, saya telah mendefinisikannya di application.yaml seperti itu:

logging:
  level:
    ROOT: TRACE

Saya menggunakan spring-boot: 2.2.0.RELEASE. Anda dapat menentukan paket apa saja yang harus memiliki tingkat TRACE seperti itu.

fascynacja
sumber
1
Ini diatur pada tingkat aplikasi. OP ingin melacak hanya untuk log hibernasi di mana Anda akan memerlukan filter tingkat paket dalam pengaturan log
Sudip Bhandari
2

dalam proyek boot musim semi kita dapat menulis logging.level.root = PERINGATAN tetapi di sini masalahnya adalah, kita harus memulai kembali bahkan kita menambahkan dependensi devtools, dalam file properti jika kita memodifikasi nilai apa pun tidak akan dapat terdeteksi secara otomatis, karena keterbatasan ini saya jadi tahu solusi i, e kita dapat menambahkan aktuator di pom.xml dan melewati level logger seperti di bawah ini yang ditunjukkan pada klien tukang pos di url bar http: // localhost: 8080 / loggers / ROOT atau http: // localhost: 8080 / loggers / com .mycompany dan di dalam tubuh Anda dapat melewati format json seperti di bawah ini

{
  "configuredLevel": "WARN"
}
siddartha kamble
sumber
1

Dalam kasus gerhana IDE dan proyek Anda adalah pakar, ingatlah untuk membersihkan dan membangun proyek untuk mencerminkan perubahan.

Sabarish Kumaran.V
sumber
1

Dengan Springboot 2 Anda dapat mengatur Level logging root dengan Variabel Lingkungan seperti ini:

logging.level.root=DEBUG

Atau Anda dapat mengatur pencatatan khusus untuk paket-paket seperti ini:

logging.level.my.package.name=TRACE
Jakudaba
sumber
untuk konfigurasi variabel lingkungan, Anda lebih suka menggunakan LOGGING_LEVEL_ROOT=DEBUG
:,