Spring Boot: ฉันจะกำหนดระดับการบันทึกด้วย application.properties ได้อย่างไร?


301

นี่เป็นคำถามที่ง่ายมาก แต่ฉันไม่สามารถหาข้อมูลได้
(บางทีความรู้ของฉันเกี่ยวกับกรอบงาน Java ขาดไปอย่างรุนแรง)

ฉันจะตั้งค่าระดับการบันทึกด้วย application.properties ได้อย่างไร?
และตำแหน่งไฟล์บันทึก ฯลฯ ?


1
สำหรับบันทึกตัวเลือกอื่นคือการตั้งค่าระดับการบันทึกเป็นตัวแปรสภาพแวดล้อมเช่นผ่านแดชบอร์ด heroku ในSettings-> Config Varsตั้งค่าlogging.level.com.yourpackageเป็นระดับที่ต้องการ (INFO, ERROR, DEBUG)
LukeSolar

คำตอบ:


355

อัปเดต:เริ่มต้นด้วย Spring Boot v1.2.0.RELEASE การตั้งค่าในapplication.propertiesหรือapplication.ymlใช้ ดูส่วนบันทึกระดับของคู่มืออ้างอิง

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

สำหรับ Spring Boot เวอร์ชั่นก่อนหน้าคุณไม่สามารถทำได้ คุณเพียงแค่ต้องใช้การกำหนดค่าปกติสำหรับกรอบการบันทึกของคุณ (log4j, logback) สำหรับสิ่งนั้น เพิ่มไฟล์ config ที่เหมาะสม ( log4j.xmlหรือlogback.xml) ไปยังsrc/main/resourcesไดเรกทอรีและกำหนดค่าตามที่คุณต้องการ

คุณสามารถเปิดใช้งานการบันทึกการดีบักโดยระบุ--debugเมื่อเริ่มต้นแอปพลิเคชันจากบรรทัดคำสั่ง

Spring Boot ยังเป็นจุดเริ่มต้นที่ดีสำหรับการย้อนกลับเพื่อกำหนดค่าเริ่มต้นการระบายสี ฯลฯไฟล์base.xmlซึ่งคุณสามารถรวมไว้ในไฟล์ logback.xml ของคุณได้ (แนะนำให้ทำเช่นนี้จากค่าเริ่มต้นlogback.xmlใน Spring Boot

<include resource="org/springframework/boot/logging/logback/base.xml"/>     

8
โดยปกติสิ่งใดก็ตามที่คุณสามารถทำได้บนบรรทัดคำสั่งจะทำงานในไฟล์ปรับแต่งภายนอก ดังนั้น debug = จริงฉันคิดว่าจะทำ การตั้งค่าสถานะนั้นค่อนข้างพิเศษเพราะการบันทึกจะต้องเริ่มต้นเร็ว แต่ฉันคิดว่ามันจะใช้ได้
Dave Syer

7
BTW ระบบการบันทึกที่ต้องการคือการย้อนกลับและนั่นคือสิ่งที่คุณได้รับตามค่าเริ่มต้นจากปอมเริ่มต้น ดังนั้น logback.xml เป็นเครื่องมือที่ใช้กันมากที่สุดในการกำหนดค่าการบันทึกในลักษณะที่ละเอียด แฟล็ก --debug เพียงแค่เปิดบางช่องการบันทึกของ Spring ที่เลือก
Dave Syer

เคล็ดลับก็บูตฤดูใบไม้ผลิมีความสุขbase.xml ซึ่งเป็นจุดเริ่มต้นที่ดี (ดูคำตอบเพิ่มเติมของฉัน)
M. Deinum

@ M.Deinum ขอบคุณอีกครั้งสำหรับเคล็ดลับสุดยอดของคุณ! ตอนนี้ฉันสามารถเปลี่ยนระดับการบันทึกสำหรับรหัสของฉันเอง
zeodtr

2
ดูเหมือนว่าเราจะทำได้ในตอนนี้ สำหรับ Spring v4.1.3.RELEASE (ด้วย Spring Boot v1.2.0.RELEASE) การตั้งค่าในapplication.propertiesหรือapplication.ymlนำไปใช้ตามคำตอบของ Richard (modulo :หรือ=ปัญหา --- โคลอนดูเหมือนว่าใช้ได้สำหรับฉัน)
Eric Platon

108

คุณสามารถทำได้โดยใช้ application.properties ของคุณ

logging.level.=ERROR-> ตั้งค่าระดับการบันทึกรากเป็นข้อผิดพลาด
...
logging.level.=DEBUG-> ตั้งค่าระดับการบันทึกรากเป็น DEBUG

logging.file=${java.io.tmpdir}/myapp.log-> ตั้งค่าเส้นทางไฟล์บันทึกสัมบูรณ์เป็น TMPDIR / myapp.log

ชุดของ application.properties ที่เป็นค่าเริ่มต้นคือการใช้โปรไฟล์: application.properties:

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=

เมื่อคุณพัฒนาภายใน IDE ที่คุณชื่นชอบคุณเพียงเพิ่ม-Dspring.profiles.active=devอาร์กิวเมนต์ VM เป็นการกำหนดค่า run / debug ของแอปของคุณ

สิ่งนี้จะทำให้คุณมีข้อผิดพลาดเฉพาะการเข้าสู่ระบบการผลิตและการบันทึกการดีบักในระหว่างการพัฒนาโดยไม่ต้องเขียนผลลัพธ์ไปยังไฟล์บันทึก สิ่งนี้จะปรับปรุงประสิทธิภาพในระหว่างการพัฒนา (และบันทึกไดรฟ์ SSD ในบางชั่วโมงของการทำงาน))


1
เครื่องหมาย '=' สำหรับการมอบหมายไม่ทำงาน การมอบหมายเสร็จสิ้นด้วย ':' เป็นตัวคั่น logging.level.:DEBUG
randominstanceOfLivingThing

2
แปลกฉันมีการตั้งค่านี้ทำงานในโครงการตัวอย่าง เครื่องหมาย '' (ช่องว่าง), '=' และ ':' จะถือว่าเป็นตัวคั่นเท่ากันยกเว้นในกรณีที่ใช้ตัวคั่นในคีย์ คุณแน่ใจหรือว่ารหัสของคุณไม่มีช่องว่างสีขาว?
ริชาร์ด

1
สามารถยืนยันได้ว่า ":" ใช้งานได้ แต่ "=" ถูกละเว้นแก้ไข: พูดถึงเร็ว ๆ นี้มีช่องว่างระหว่าง "=" และระดับ ทุกอย่างทำงานได้ในขณะนี้
Mike R

1
สิ่งนี้ใช้ไม่ได้ในการทดสอบของฉันด้วยspring-boot 1.4.0: logging.level.=DEBUGจะทำให้แอปพลิเคชันไม่สามารถเริ่มต้นและได้รับข้อผิดพลาด:java.lang.ClassCircularityError: java/util/logging/LogRecord
Eric Wang

2
ดูเหมือนว่าสำหรับฉัน logging.level.เป็นเพียงทางลัดทางลัดสำหรับความสะดวกสบายlogging.level.rootซึ่งอาจจะเป็น (1) มีแนวโน้มที่จะสับสนน้อยกว่ากับการพิมพ์ผิด (2) มีความชัดเจนมากขึ้นและ (3) การทำงานกับ=เครื่องหมายกำหนดซึ่งให้ความมั่นคงโดยรวมมากขึ้น ไปยังไฟล์การกำหนดค่า
Alain BECKER

66

วิธีการที่เหมาะสมที่จะตั้งรากlogging.level.rootระดับการบันทึกการใช้ทรัพย์สิน ดูเอกสารซึ่งได้รับการปรับปรุงเนื่องจากคำถามนี้ถูกถามตั้งแต่แรก

ตัวอย่าง:

logging.level.root=WARN

15

com.company.myprojectสมมติว่าแอพลิเคชันของคุณมีชื่อแพคเกจเป็น จากนั้นคุณสามารถตั้งค่าระดับการบันทึกสำหรับคลาสภายในโครงการของคุณตามที่ระบุด้านล่างในไฟล์ application.properties

logging.level.com.company.myproject = DEBUG

logging.level.org.springframework.web = DEBUGและlogging.level.org.hibernate = DEBUGจะตั้งค่าระดับการบันทึกสำหรับคลาสของ Spring framework web และ Hibernate เท่านั้น

สำหรับการตั้งค่าการใช้ตำแหน่งไฟล์บันทึก

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


14

หากคุณอยู่ใน Spring Boot คุณสามารถเพิ่มคุณสมบัติต่อไปนี้โดยตรงในไฟล์application.propertiesเพื่อตั้งค่าระดับการบันทึกกำหนดรูปแบบการบันทึกและจัดเก็บบันทึกในไฟล์ภายนอก

เหล่านี้คือระดับการบันทึกที่แตกต่างกันและคำสั่งซื้อจากขั้นต่ำ << สูงสุด

ปิด << FATAL << ข้อผิดพลาด << คำเตือน << ข้อมูล << การดีบัก << การติดตาม << ทั้งหมด

# 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"

โปรดผ่านลิงค์นี้เพื่อปรับแต่งบันทึกของคุณให้ชัดเจนยิ่งขึ้น

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


ฉันไม่รู้ว่าทำไม แต่ logging.level.tech.hardik = ติดตามสิ่งนี้ไม่ทำงานในกรณีของฉันเมื่อฉันใส่ logging.level.roo = ติดตามมันทำงาน
Arvind Kumar

10

ทำให้แน่ใจว่าเคล็ดลับ Dave Syer ได้รับความรักเนื่องจากการเพิ่มdebug=trueไปยัง application.properties จะเปิดใช้งานการบันทึกการดีบักอย่างแน่นอน


8

ในกรณีที่คุณต้องการใช้เฟรมเวิร์กการบันทึกที่แตกต่างกันตัวอย่างเช่น log4j ฉันพบว่าวิธีที่ง่ายที่สุดคือการปิดใช้งานการบันทึกของบู๊ทส์สปริงและใช้งานของคุณเอง ด้วยวิธีนี้ฉันสามารถกำหนดค่า loglevel ทุกอันในไฟล์เดียวคือ log4j.xml (ในกรณีของฉัน) นั่นคือ

เพื่อให้บรรลุเป้าหมายคุณต้องเพิ่มบรรทัดเหล่านั้นใน pom.xml ของคุณ:

<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>

คุณอาจมีการอ้างอิงแรกแล้วและต้องการอีกสองรายการเท่านั้น โปรดทราบว่าตัวอย่างนี้ครอบคลุมเฉพาะ log4j
เพียงเท่านี้คุณก็พร้อมที่จะกำหนดค่าการบันทึกสำหรับการบู๊ตภายในไฟล์ config4 ของคุณ!


การยกเว้นนี้ใช้ได้สำหรับฉัน ฉัน REST Api ไม่ได้หยิบพึ่งพา log4j log4j.propertiesของฉันและ
ankitjaininfo

พวกเขายังมี spring-boot-starter-log4j2 ทันที
Kalpesh Soni

4

คุณสามารถลองตั้งค่าระดับการบันทึกเป็น DEBUG ซึ่งจะแสดงทุกอย่างขณะเริ่มต้นแอปพลิเคชัน

logging.level.root=DEBUG

3

สำหรับบันทึก: เอกสารอย่างเป็นทางการเช่นเดียวกับ Spring Boot v1.2.0.RELEASE และ Spring v4.1.3.RELEASE:

หากการเปลี่ยนแปลงเพียงอย่างเดียวที่คุณต้องใช้ในการบันทึกคือการกำหนดระดับของตัวบันทึกต่าง ๆ คุณสามารถทำได้ใน application.properties โดยใช้คำนำหน้า "logging.level" เช่น

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

นอกจากนี้คุณยังสามารถตั้งค่าตำแหน่งของไฟล์ที่จะเข้าสู่ระบบ (นอกเหนือจากคอนโซล) โดยใช้ "logging.file"

ในการกำหนดค่าการตั้งค่าที่ละเอียดยิ่งขึ้นของระบบการบันทึกคุณจำเป็นต้องใช้รูปแบบการกำหนดค่าดั้งเดิมที่รองรับโดย LoggingSystem โดยค่าเริ่มต้น Spring Boot จะรับการกำหนดค่าดั้งเดิมจากตำแหน่งเริ่มต้นสำหรับระบบ (เช่น classpath: logback.xml สำหรับ Logback) แต่คุณสามารถตั้งค่าตำแหน่งของไฟล์กำหนดค่าได้โดยใช้คุณสมบัติ "logging.config"


2

หากคุณต้องการตั้งค่ารายละเอียดเพิ่มเติมโปรดเพิ่มชื่อไฟล์บันทึกการตั้งค่า "logback.xml" หรือ "logback-spring.xml"

ในไฟล์ application.properties ของคุณให้ป้อนข้อมูลดังนี้:

logging.config: classpath:logback-spring.xml

ใน loback-spring.xml ให้ป้อนข้อมูลดังนี้:

    <?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>

2

คำตอบที่มีอยู่นั้นยอดเยี่ยม ฉันต้องการแบ่งปันคุณลักษณะการบูตฤดูใบไม้ผลิใหม่ให้กับคุณเพื่อจัดกลุ่มบันทึกและตั้งค่าระดับการบันทึกในกลุ่มทั้งหมด

ตัวอย่างจากเอกสาร:

  • สร้างกลุ่มการบันทึก
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
  • ตั้งค่าระดับการบันทึกสำหรับกลุ่ม
logging.level.tomcat=TRACE

มันเป็นคุณสมบัติที่ดีที่นำความยืดหยุ่นมากขึ้น


2

ในการกำหนดค่าปัจจุบันของฉันฉันมีมันกำหนดไว้ในapplication.yamlเช่นนั้น:

logging:
  level:
    ROOT: TRACE

ฉันใช้บูทบูท: 2.2.0 ปล่อย คุณสามารถกำหนดแพ็คเกจใด ๆ ที่ควรมีระดับการติดตามเช่นนั้น


1
สิ่งนี้จะตั้งค่าที่ระดับแอปพลิเคชัน OP ต้องการการติดตามเฉพาะสำหรับบันทึกการจำศีลซึ่งคุณจะต้องใช้ตัวกรองระดับแพ็คเกจในการตั้งค่าบันทึก
Sudip Bhandari

2

ในโครงการ boot ฤดูใบไม้ผลิเราสามารถเขียน logging.level.root = WARN แต่นี่คือปัญหาเราต้องเริ่มต้นใหม่อีกครั้งแม้ว่าเราจะเพิ่มการพึ่งพา devtools ในไฟล์คุณสมบัติถ้าเราแก้ไขค่าใด ๆ จะไม่ตรวจสอบอัตโนมัติสำหรับข้อ จำกัด นี้ฉันรู้ โซลูชัน i, e เราสามารถเพิ่มแอคทูเอเตอร์ใน pom.xml และส่งผ่านระดับตัวบันทึกดังที่แสดงในไคลเอนต์บุรุษไปรษณีย์ใน url bar http: // localhost: 8080 / loggers / ROOTหรือ http: // localhost: 8080 / loggers / com . mycompany และในเนื้อความคุณสามารถผ่านรูปแบบ json ดังด้านล่าง

{
  "configuredLevel": "WARN"
}

1

ในกรณีของ eclipse IDE และโครงการของคุณคือ maven อย่าลืมล้างและสร้างโครงการเพื่อให้สอดคล้องกับการเปลี่ยนแปลง


1

ด้วย Springboot 2 คุณสามารถตั้งค่าระดับการบันทึกรากด้วยตัวแปรสภาพแวดล้อมดังนี้:

logging.level.root=DEBUG

หรือคุณสามารถตั้งค่าการบันทึกเฉพาะสำหรับแพ็คเกจเช่นนี้:

logging.level.my.package.name=TRACE

สำหรับการกำหนดค่าตัวแปรสภาพแวดล้อมคุณควรใช้: LOGGING_LEVEL_ROOT=DEBUGโดยใช้ไวยากรณ์ของกรณีอูฐ
Anthony Dahanne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.