题目目录
1.项目调试技巧及日志管理
从四个方面了解:
- 响应状态码的含义
- 服务端断点调试技巧
- 客户端断点调试技巧
- 设置日志级别,并将日志输出到不同的终端
1.1 响应状态码的含义
百度
1.2 服务端断点调试技巧
也就是后端代码;debug时常用的一些快捷键功能:
debug
时常用的一些快捷键
功能:
F9
:程序直接向下执行,直到下一个断点为止;如果没有断点了,直接将程序执行到底。
F8
:一行一行向下走;
F7
:进入到断点行的一个方法内查看;比如我这一行,里面有调用一个service中的一个insert方法,按F7即可进入方法查看;
1.3 客户端断点调试技巧
也就是前端代码
1.4 设置日志级别,并将日志输出到不同的终端
五个
级别:trace(等级太低,几乎不用)、debug、info、warn、error
1.4.1 测试日志级别:debug
1.application.properties
#logger--意思是把com.yty.community这个包的日志级别调为 debug
logging.level.com.yty.community=debug;
2.LoggerTests
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class LoggerTests {
private static final Logger logger = LoggerFactory.getLogger(LoggerTests.class);
@Test
public void testLogger(){
System.out.println(logger.getName());
logger.debug("我是debug log");
logger.info("我是info log");
logger.warn("我是warn log");
logger.error("我是error log");
}
}
3.测试结果
1.4.2 测试日志级别:warn
1.application.properties
#logger--意思是把com.yty.community这个包的日志级别调为 warn
logging.level.com.yty.community=warn;
2.LoggerTests
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class LoggerTests {
private static final Logger logger = LoggerFactory.getLogger(LoggerTests.class);
@Test
public void testLogger(){
System.out.println(logger.getName());
logger.debug("我是debug log");
logger.info("我是info log");
logger.warn("我是warn log");
logger.error("我是error log");
}
}
3.测试结果
1.4.3 两次日志级别测试说明
定义为什么等级的日志,比它小的级别不会打印出来,大的或等于的级别会打印出来;
1.4.4 日志信息打印到文件
开发默认情况下,我们是把日志打印到控制台的;
那么系统上线以后,就得存到一个指定的文件里。
1.4.4.1 最原始日志存储方式
1.application.properties
首先,还是在application.properties文件里进行声明
#logger--意思是把这个包的日志级别调为 debug
logging.level.com.yty.community=debug;
#声明日志文件
logging.file.name=e:/idea_project/Logger/community/community.log
2.测试类进行测试
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class LoggerTests {
private static final Logger logger = LoggerFactory.getLogger(LoggerTests.class);
@Test
public void testLogger(){
System.out.println(logger.getName());
logger.debug("我是debug log");
logger.info("我是info log");
logger.warn("我是warn log");
logger.error("我是error log");
}
}
3.测试结果
1.4.4.2 ❤分类日志存储方式❤
通过最原始的方式,日志信息虽然能打印到文件中,但是有一个问题,就是什么定义的日志级别及以上级别的信息都在一个文件中,文件大而杂;
我们需要的是按照日志不同级别
存到不同文件
里,而且文件大小达到xxMB后就自动拆分
出另一个同级别文件。
1.首先注释掉properties中的日志声明
2.❤引入LogBack官网的logback-spring.xml
配置文件
将文件放到resource目录下,SpringBoot会自动启用文件里的配置。(文件名必须
为logback-spring.xml)。
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>community</contextName>
<property name="LOG_PATH" value="E:/idea_project/Logger"/>
<property name="APPDIR" value="community"/><!--这个就是上面路径的一个子路径,即路径为E:/idea_project/Logger/community-->
<!-- error file -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APPDIR}/log_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append><!--true开启:代表追加的形式存日志,而不是覆盖形式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch><!--匹配则接受此条日志信息-->
<onMismatch>DENY</onMismatch><!--不匹配则放弃接受此条日志信息-->
</filter>
</appender>
<!-- warn file -->
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- info file -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- console -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<!--这个就是在application.properties注释的信息;其实就是将配置放到配置文件中统一管理了-->
<logger name="com.yty.community" level="debug"/><!--com.yty.community包下的日志级别为debug-->
<!--root表示整个项目所有的包根目录默认级别为info;因为根目录包含所有的jar里面的类,这个地方不能debug,否则日志太多了,所以用的info-->
<root level="info">
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3.测试类进行测试
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class LoggerTests {
private static final Logger logger = LoggerFactory.getLogger(LoggerTests.class);
@Test
public void testLogger(){
System.out.println(logger.getName());
logger.debug("我是debug log");
logger.info("我是info log");
logger.warn("我是warn log");
logger.error("我是error log");
}
}
4.测试结果
console控制台
文件本机路径