Springboot 项目中怎么配置 logback 日志系统?
网上的集成有很多,但是感觉都是零散的,想着自己搭建一个springboot+logback+lombok的线上服务器实战记录帖子
环境&版本一览:
- 开发工具:Intellij IDEA 2020.1.1
- springboot: 2.5.4
- jdk:1.8.0
- maven:3.8.3
- SLF4j + Logback + Lombok
maven 配置
Logback 是spring-boot-starter-web默认实现
,所以我们可以不引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<optional>true</optional>
</dependency>
- 日志的级别
public enum Level {
ERROR(40, "ERROR"),
WARN(30, "WARN"),
INFO(20, "INFO"), //默认级别
DEBUG(10, "DEBUG"),
TRACE(0, "TRACE");
// 上面最高,下面最低,日志级别从上往下看 `由高到底`
配置文件
服务器创建对应的文件夹
sudo mkdir -p /var/log/ql
sudo chmod -R 777 /var/log/ql
本地开发环境
application.properties
logging.level.root=info
logging.file.path=/var/log/ql
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%method,%line] - %msg%n
logging.pattern.console== %white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %yellow(%msg%n)
logging.logback.rollingpolicy.max-history=7
logging.logback.rollingpolicy.max-file-size=50MB
logging.logback.rollingpolicy.total-size-cap=5GB
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<!-- <property name="log.path" value="/var/log/ql"/>-->
<springProperty scope="context" name="log.path" source="log.path" defaultValue="/var/log/default"/>
<!-- 日志输出格式 -->
<springProperty scope="context" name="logging.pattern.console" source="logging.pattern.console"
defaultValue="%white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %cyan(%msg%n)"/>
<!-- <property name="log.pattern"-->
<!-- value="%white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %yellow(%msg%n)"/>-->
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${logging.pattern.console}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ql.center" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="console"/>
</root>
</configuration>
online 环境
resource/application.properties
logging.config=classpath:logback-spring-online.xml
logging.level.root=info
logging.file.path=/var/log/ql
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%method,%line] - %msg%n
logging.pattern.console== %white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %yellow(%msg%n)
logging.logback.rollingpolicy.max-history=7
logging.logback.rollingpolicy.max-file-size=50MB
logging.logback.rollingpolicy.total-size-cap=5GB
resource/logback-spring-online.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<springProperty scope="context" name="logging.file.path" source="logging.file.path" defaultValue="/var/log/default"/>
<!-- 控制台日志输出格式 -->
<springProperty scope="context" name="logging.pattern.file" source="logging.pattern.file"
defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%method,%line] - %msg%n"/>
<!-- 文件日志输出格式 -->
<springProperty scope="context" name="logging.pattern.console" source="logging.pattern.console"
defaultValue="%white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %cyan(%msg%n)"/>
<springProperty scope="context" name="logging.logback.rollingpolicy.max-history"
source="logging.logback.rollingpolicy.max-history" defaultValue="3"/>
<springProperty scope="context" name="logging.logback.rollingpolicy.max-file-size"
source="logging.logback.rollingpolicy.max-file-size" defaultValue="10MB"/>
<springProperty scope="context" name="logging.logback.rollingpolicy.total-size-cap"
source="logging.logback.rollingpolicy.total-size-cap" defaultValue="1GB"/>
<springProperty scope="context" name="logging.level.root"
source="logging.level.root" defaultValue="INFO"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${logging.pattern.console}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logging.file.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${logging.file.path}/sys-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>${logging.logback.rollingpolicy.max-history}</maxHistory>
<!-- 每个日志文件的最大大小 -->
<maxFileSize>${logging.logback.rollingpolicy.max-file-size}</maxFileSize>
<!-- 总空间使用限制,例如1GB -->
<totalSizeCap>${logging.logback.rollingpolicy.total-size-cap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logging.pattern.file}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 只会打印debug不会有info日志-->
<level>${logging.level.root}</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logging.file.path}/sys-warn.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${logging.file.path}/sys-warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>${logging.logback.rollingpolicy.max-history}</maxHistory>
<!-- 每个日志文件的最大大小 -->
<maxFileSize>${logging.logback.rollingpolicy.max-file-size}</maxFileSize>
<!-- 总空间使用限制,例如1GB -->
<totalSizeCap>${logging.logback.rollingpolicy.total-size-cap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logging.pattern.file}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 只会打印debug不会有info日志-->
<level>WARN</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logging.file.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${logging.file.path}/sys-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>${logging.logback.rollingpolicy.max-history}</maxHistory>
<!-- 每个日志文件的最大大小 -->
<maxFileSize>${logging.logback.rollingpolicy.max-file-size}</maxFileSize>
<!-- 总空间使用限制,例如1GB -->
<totalSizeCap>${logging.logback.rollingpolicy.total-size-cap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logging.pattern.file}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <!– 过滤的级别 –>-->
<!-- <level>ERROR</level>-->
<!-- <!– 匹配时的操作:接收(记录) –>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <!– 不匹配时的操作:拒绝(不记录) –>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
</appender>
<!-- 用户访问日志输出 -->
<!-- 系统模块日志级别控制 -->
<logger name="com.ql.center" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_warn"/>
<appender-ref ref="file_error"/>
</root>
</configuration>
开发代码
@Slf4j
@Api(tags = "账号相关信息")
@RestController
@RequestMapping("/account")
public class AccountController {
private SysAccountManager sysAccountManager;
@ApiOperation(value = "手机、密码登录", notes = "返回 RestBody<String> 类型")
@ArchivesLog(allowEntry = true, methodMeaning = "《《手机、密码登录》》")
@PostMapping(value = "/loginByMobile", produces = MediaType.APPLICATION_JSON_VALUE)
public RestBody<String> loginByMobile(@RequestBody MobileLoginDTO dto) {
log.debug("<<Im debug>>");
log.info("<<Im info>>");
log.warn("<<Im warn>>");
log.error("<<Im error>>");
return RestBody.success(sysAccountManager.doLoginMobile(dto));
}
}
- 项目启动后会看到
- 然后当
logging.level.root=info
。 - 会把
log.info("<<Im info>>");
打印到sys-info.log
内。 - 会把
log.warn("<<Im warn>>");
打印到sys-warn.log
内。 - 会把
log.error("<<Im error>>");
打印到sys-error.log
内。 - 然后当
logging.level.root=error
。 - 会把
llog.error("<<Im error>>");
打印到sys-info.log
内。 - 会把
log.error("<<Im error>>");
打印到sys-error.log
内。
以上配置,线上环境基本可用,具体可根据自己的需求进行微调修改!