springboot集成Logback+lombok服务器实战

116 阅读2分钟

网上的集成有很多,但是感觉都是零散的,想着自己搭建一个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">-->
    <!--      &lt;!&ndash; 过滤的级别 &ndash;&gt;-->
    <!--      <level>ERROR</level>-->
    <!--      &lt;!&ndash; 匹配时的操作:接收(记录) &ndash;&gt;-->
    <!--      <onMatch>ACCEPT</onMatch>-->
    <!--      &lt;!&ndash; 不匹配时的操作:拒绝(不记录) &ndash;&gt;-->
    <!--      <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 内。

以上配置,线上环境基本可用,具体可根据自己的需求进行微调修改!