springboot项目(7)集成logback.xml

2025-11-03 11:00:03

1、老规矩要集成的项目是按照最新springboot项目(六)来集成的,是其他的Springboot项目也是没关系的,基本上是属于通用。废话不多说直接上教程。

2、首先在resouces目录下创建一个logback-spring.xml文件,为什么叫这个名字呢?是因为logback默认的会从资源目录读取这个文件,而且使用这个命名有好处:可以使用springProperty和springProfile标签。

3、其次是spring-boot-starter-parent依赖已经包含了logback-classic,log4j-to-slf4j等依赖,所以我们不需要在pom.xml文件中重新添加依赖了,怎么看呢?ctrl+单击点spring-boot-starter-parent==》spring-boot-dependencies==》spring-boot-starter==》spring-boot-starter-logging==》

springboot项目(7)集成logback.xml

springboot项目(7)集成logback.xml

springboot项目(7)集成logback.xml

springboot项目(7)集成logback.xml

springboot项目(7)集成logback.xml

4、然后配置logback-spring.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>


<configuration scan="true" scanPeriod="60 seconds" debug="false">
   <contextName>logback</contextName>
   <property resource="application.yml"/>


   <springProperty scope="context" name="log.path" source="logging.path"/>
   <springProperty scope="context" name="log.lv" source="logging.lv"/>
   <springProperty scope="context" name="log.dateSize" source="logging.dateSize"/>


   <!--输出到控制台-->
   <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
       <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
       <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
           <level>${log.lv}</level>
       </filter>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
           <!--编码-->
           <charset>utf-8</charset>
       </encoder>
   </appender>


   <!--输出到debug-->
   <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 正在记录的日志文件的路径及文件名 -->
       <file>${log.path}/logback-debug.log</file>
       <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${log.path}/logback-debug-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>100MB</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
           <!--日志文件保留天数-->
           <maxHistory>15</maxHistory>
       </rollingPolicy>
       <append>true</append>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
           <!--编码-->
           <charset>utf-8</charset>
       </encoder>
       <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
           <level>DEBUG</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
   </appender>


   <!--输出到info-->
   <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 正在记录的日志文件的路径及文件名 -->
       <file>${log.path}/logback-info.log</file>
       <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${log.path}/logback-info-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>100MB</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
           <!--日志文件保留天数-->
           <maxHistory>${log.dateSize}</maxHistory>
       </rollingPolicy>
       <append>true</append>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
           <!--编码-->
           <charset>utf-8</charset>
       </encoder>
       <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
           <level>INFO</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
   </appender>


   <!--输出到warn-->
   <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 正在记录的日志文件的路径及文件名 -->
       <file>${log.path}/logback-warn.log</file>
       <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${log.path}/logback-warn-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>100MB</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
           <!--日志文件保留天数-->
           <maxHistory>${log.dateSize}</maxHistory>
       </rollingPolicy>
       <append>true</append>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
           <charset>utf-8</charset>
       </encoder>
       <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 -->
           <level>WARN</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
   </appender>


   <!--输出到error-->
   <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 正在记录的日志文件的路径及文件名 -->
       <file>${log.path}/logback-error.log</file>
       <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <fileNamePattern>${log.path}/logback-error-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
           <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
               <maxFileSize>100MB</maxFileSize>
           </timeBasedFileNamingAndTriggeringPolicy>
           <!--日志文件保留天数-->
           <maxHistory>${log.dateSize}</maxHistory>
       </rollingPolicy>
       <append>true</append>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
           <charset>utf-8</charset>
       </encoder>
       <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
           <level>ERROR</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
   </appender>


   <!--邮件配置-->
   <springProperty scope="context" name="smtpHost" source="email.smtpHost"/>
   <!-- SMTP server的端口地址。 -->
   <springProperty scope="context" name="smtpPort" source="email.smtpPort"/>
   <!-- 发送邮件账号 -->
   <springProperty scope="context" name="username" source="email.username"/>
   <!-- 发送邮件密码(此密码客户端授权密码,不是邮箱登录密码) -->
   <springProperty scope="context" name="password" source="email.password"/>
   <!-- 如果设置为true,appender将会使用SSL连接到日志服务器。默认值:false -->
   <springProperty scope="context" name="SSL" source="email.SSL"/>
   <!-- 指定收件人邮箱,可设置多个邮箱,收件人账号需以逗号隔开 -->
   <springProperty scope="context" name="email_to" source="email.email_to"/>
   <!-- 指定发件人名称。 -->
   <springProperty scope="context" name="email_from" source="email.email_from"/>
   <!-- 标题  -->
   <property name="email_subject" value="【System Error】: %msg" />


   <!-- 邮件发送的appender -->
   <appender name="Email" class="ch.qos.logback.classic.net.SMTPAppender">
       <smtpHost>${smtpHost}</smtpHost>
       <smtpPort>${smtpPort}</smtpPort>
       <username>${username}</username>
       <password>${password}</password>
       <asynchronousSending>false</asynchronousSending>
       <SSL>${SSL}</SSL>
       <to>${email_to}</to>
       <from>${email_from}</from>
       <subject>${email_subject}</subject>
       <!-- html格式 -->
       <layout class="ch.qos.logback.classic.html.HTMLLayout">
           <Pattern>%date - %level [%thread] %logger{50} %line %message</Pattern>
       </layout>
       <!-- 等级过滤器,指定ERROR级别发送 -->
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
           <level>ERROR</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
       <!-- 每个电子邮件只发送一个日志条目 -->
       <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
           <bufferSize>1</bufferSize>
       </cyclicBufferTracker>
   </appender>


   <!--不同环境分别设置对应的日志输出节点 -->
   <!--开发-->
   <springProfile name="dev">
       <root level="debug">
           <appender-ref ref="console" />
           <appender-ref ref="info" />
           <appender-ref ref="warn" />
           <appender-ref ref="error" />
       </root>
   </springProfile>


   <!--测试-->
   <springProfile name="test">
       <root level="warn">
           <appender-ref ref="console" />
           <appender-ref ref="warn" />
           <appender-ref ref="error" />
           <appender-ref ref="Email" />
       </root>
   </springProfile>


   <!--生产环境-->
   <springProfile name="pro">
       <root level="info">
           <appender-ref ref="console" />
           <appender-ref ref="debug" />
           <appender-ref ref="info" />
           <appender-ref ref="warn" />
           <appender-ref ref="error" />
           <appender-ref ref="Email" />
       </root>
   </springProfile>


</configuration>

5、配置完xml文件后配置yml或properties文件,配置如下(这里直接按yml文件为标准):

spring:


 profiles:
   active: dev #用来配置所属环境

#日志配置


logging:
 path: C:/WEB-INF/logs #保存日志
 lv: info # 控制台日志输出级别
 dateSize: 1 # 日志保存天数


#邮箱配置
email:

  #主机

 smtpHost: smtp.qq.com

 #端口(465或587)

 smtpPort: 465


 username: *********@qq.com
 password: *******************
 SSL: true
 email_from: *********@qq.com
 email_to: *********@qq.com,*********@qq.com

springboot项目(7)集成logback.xml

6、知识点1:由于logback-spring.xml先于application.yml被系统加载,所以想要引用application.yml文件中的数据,需要加入<property resource="application.yml"/>标签,引入后怎么获取到呢?比如想要获取日志保存天数,就需要引入<springProperty scope="context" name="log.dateSize" source="logging.dateSize"/>后面的引用,就只需要${log.dateSize}就可以了,中括号里面的值是springProperty 的name值。

知识点2:springProfile对应的是application.yml文件中的spring.profiles.active的值。

知识点3:配置文件中的邮件密码不是邮箱登录密码,而是客户端授权密码,如何获取查询QQ邮箱登陆第三方客户端获取授权码就可以了。

1、启动项目,我能能够看到日志被日志文件所记录,而且文件里面记录的时间与控制台打印的时间完全一致,如下图:

springboot项目(7)集成logback.xml

springboot项目(7)集成logback.xml

2、测试异常发送邮件:

@RunWith(SpringRunner.class)


@SpringBootTest
public class LogTest {


   private Logger log = LoggerFactory.getLogger(LogTest.class);


   @Test
   public void test() {
       log.error("出现异常需要发送邮件");
   }
}

springboot项目(7)集成logback.xml

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢