Spring Boot能否通过application.properties实现按包、按日志级别分文件记日志
Absolutely! Spring Boot (backed by Logback by default, though it works with Log4j2 too) lets you split logs exactly as you need—both by level and by package—right from your application.properties file. No need for separate XML config files if you don't want them. Let me walk you through how to set this up.
To route ERROR logs to error.log and DEBUG logs to debug.log, you'll define separate "appenders" (think of them as dedicated log channels) for each level, then attach them to your root logger.
Here's the full configuration:
# Base root logging level (captures all levels above this by default) logging.level.root=INFO # Appender for ERROR-level logs logging.appender.error.file=./logs/error.log logging.appender.error.level=ERROR logging.appender.error.max-file-size=10MB # Rollover when file hits 10MB logging.appender.error.max-history=30 # Keep 30 days of old logs logging.appender.error.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n # Appender for DEBUG-level logs logging.appender.debug.file=./logs/debug.log logging.appender.debug.level=DEBUG logging.appender.debug.max-file-size=10MB logging.appender.debug.max-history=30 logging.appender.debug.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n # Attach both appenders to the root logger logging.root.appender-ref.error.ref=error logging.root.appender-ref.debug.ref=debug
Optional: Restrict debug.log to only DEBUG logs
By default, the DEBUG appender will capture DEBUG, INFO, WARN, and ERROR logs. If you want debug.log to only contain DEBUG-level entries, add a level filter to the appender:
# Filter to keep only DEBUG logs in debug.log logging.appender.debug.filter.level.type=ch.qos.logback.classic.filter.LevelFilter logging.appender.debug.filter.level.level=DEBUG logging.appender.debug.filter.level.onMatch=ACCEPT logging.appender.debug.filter.level.onMismatch=DENY
If you want logs from specific packages (like com.yourproject.controller and com.yourproject.service) to go to separate files, you'll create appenders for each package and link them directly to those loggers.
Example configuration:
# Base root logging level logging.level.root=INFO # Appender for controller package logs logging.appender.controller.file=./logs/controller.log logging.appender.controller.level=DEBUG # Capture DEBUG and above for controllers logging.appender.controller.max-file-size=10MB logging.appender.controller.max-history=30 logging.appender.controller.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n # Appender for service package logs logging.appender.service.file=./logs/service.log logging.appender.service.level=INFO # Only capture INFO and above for services logging.appender.service.max-file-size=10MB logging.appender.service.max-history=30 logging.appender.service.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n # Link each appender to its target package logging.logger.com.yourproject.controller.appender-ref.controller.ref=controller logging.level.com.yourproject.controller=DEBUG logging.logger.com.yourproject.service.appender-ref.service.ref=service logging.level.com.yourproject.service=INFO
You can also mix these two approaches—for example, routing ERROR logs from your service package to service-error.log and DEBUG logs to service-debug.log:
# Appenders for service package levels logging.appender.service-error.file=./logs/service-error.log logging.appender.service-error.level=ERROR logging.appender.service-error.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n logging.appender.service-debug.file=./logs/service-debug.log logging.appender.service-debug.level=DEBUG logging.appender.service-debug.filter.level.type=ch.qos.logback.classic.filter.LevelFilter logging.appender.service-debug.filter.level.level=DEBUG logging.appender.service-debug.filter.level.onMatch=ACCEPT logging.appender.service-debug.filter.level.onMismatch=DENY # Attach both appenders to the service package logging.logger.com.yourproject.service.appender-ref.service-error.ref=service-error logging.logger.com.yourproject.service.appender-ref.service-debug.ref=service-debug logging.level.com.yourproject.service=DEBUG
A quick note: If you're using Log4j2 instead of Logback, the configuration syntax will be a bit different, but the core concept of defining appenders and routing logs to them remains identical.
内容的提问来源于stack exchange,提问作者Sanjay A

