项目调试技巧

  • 响应状态码的含义
  • 服务端断点调试技巧
  • 客户端断点调试技巧
  • 设置日志级别,并将日志输出到不同的终端

响应状态码

还是之前提到过的文档,HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。响应分为五类:信息响应(100199),成功响应(200299),重定向(300399),客户端错误(400499)和服务器错误 (500599)。

文档

常见的一些:

  • 200 OK

    • 请求成功。成功的含义取决于HTTP方法:
    • GET:资源已被提取并在消息正文中传输。
    • HEAD:实体标头位于消息正文中。
    • POST:描述动作结果的资源在消息体中传输。
    • TRACE:消息正文包含服务器收到的请求消息
  • 302 Found 重定向

    • 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

    • 如访问服务器删除功能,服务器没有返回的对象,用302建议访问的目标地址location

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qi0nye3Z-1604233680040)(C:\Users\43885\AppData\Roaming\Typora\typora-user-images\image-20201013103246867.png)]

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RkCiillo-1604233680041)(C:\Users\43885\AppData\Roaming\Typora\typora-user-images\image-20201013100512797.png)]

  • 404 Not Found

    • 请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
  • 500 Internal Server Error

    • 服务器遇到了不知道如何处理的情况。

服务端断点

在开发的时候,有时候出现了问题需要排查,我们就可以使用断点。断点调试就是在某一行代码打下断点,程序执行到设置的断点时会暂停,并显示相关数据。以IDEA为例,打断点的放在就是在行号旁点击一下,就可以设置一个断点。

以上一节写的HomeController为例,我在如图位置设置一个断点,然后将程序以debug模式运行,快捷键shift+F9或者点击右上角像小虫子的按钮。

然后打开浏览器,访问首页让程序运行到我们设置的断点,可以看到程序卡在了断点这一行,并且下方显示了当前的一些对象,比如page对象,我们可以点开查看page对象的值。查看发现这一行没问题,可以使用快捷键或者点击按钮向下运行一行或者进入这行代码内部。这些按钮怎么用就自行去实践了。包括左下角的功能,可以管理断点等。

客户端断点

客户端断点和服务端差不多,打开浏览器进入首页检查,找到source下的js文件,点击行号设置断点,刷新后会卡在断点,同样可以向下运行和进入代码内。

日志

断点调试之前,最好查看日志,日志内不懂的也可以百度。springboot支持多种日志工具,默认是logback

logback官网

可以看到有五种日志级别,我们可以在开发和上线的时候使用不同级别,就可以便于开发,

  • trace跟踪
  • debug调试
  • info正常
  • warn警告
  • error错误

我们先在测试类里体验一下,然后再application.properties里配置一下日志级别和日志存储路径

package com.neu.langsam.community;import org.junit.Test;
import org.slf4j.Logger;import org.junit.runner.RunWith;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class LoggerTests {//新建一个logger类private static final Logger logger= LoggerFactory.getLogger(LoggerTests.class);@Testpublic void testLogger(){System.out.println(logger.getName());logger.debug("debug log");logger.info("info log");logger.warn("warn log");logger.error("error log");}
}123456789101112131415161718192021222324252627282930313233
# logger
logging.level.com.neu.langsam.community=debug
logging.file.name=d:/workspace/community.log
123

在实际开发中,需要把各种级别的日志分开,那使用这种方式就不够了,就需要写配置文件,比较复杂,就直接复制现成的,修改一下。logback-spring.xml放在resource下,主要修改的地方在开头的路径和项目名,和结尾的包名。

<?xml version="1.0" encoding="UTF-8"?>
<configuration><contextName>community</contextName><property name="LOG_PATH" value="D:/workspace"/><property name="APPDIR" value="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><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><logger name="com.neu.langsam.community" level="debug"/><root level="info"><appender-ref ref="FILE_ERROR"/><appender-ref ref="FILE_WARN"/><appender-ref ref="FILE_INFO"/><appender-ref ref="STDOUT"/></root></configuration>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293

那么我输出到了项目目录下。

</root>

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 ```

那么我输出到了项目目录下。

牛客网项目1.7项目调试技巧相关推荐

  1. Java牛客项目课_仿牛客网讨论区_第八章

    文章目录 第八章.项目发布与总结 8.1. 单元测试 8.2.项目监控 8.3.项目部署 宝塔面板.yum.rpm.压缩包 安装 unzip.Java1.8.Maven.MySQL.Redis.Kaf ...

  2. 仿牛客网项目第二章:开发社区登录模块(详细步骤和思路)

    目录 1. 发送邮件 1.0 三步走 1.1 邮箱设置 1.2 Spring Email 1.3 模板引擎 1.4 发送邮件的过程 1.5 检验发送邮件的过程 2. 开发注册功能 2.0 注册功能的步 ...

  3. 云服务器上部署仿牛客网项目

    云服务器上部署仿牛客网项目 安装JRE 安装Maven 安装MySQL 给mysql导入数据 安装Redis 安装kafka 安装ElasticSearch Wkhtmltopdf 安装tomcat ...

  4. 从零开始—仿牛客网讨论社区项目(一)

    主要技术架构: SpringBoot Spring SpringMVC MyBatis Redis Kakfa Elasticsearch Spring Security Spring Actator ...

  5. 从零开始—仿牛客网讨论社区项目(六)

    主要技术架构: SpringBoot Spring SpringMVC MyBatis Redis Kakfa Elasticsearch Spring Security Spring Actator ...

  6. 2019牛客网高级项目

    本项目是一个基于SpringBoot的社区平台,实现了牛客网讨论区的功能.实现了邮箱注册.验证码登录.发帖.评论.私信.点赞.关注.统计网站访问次数等功能,数据库使用Mybatis.Redis,使用K ...

  7. Java牛客网社区项目——知识点面试题

    Java牛客网社区项目--知识点&面试题 持续更新中(ง •̀_•́)ง 文章目录 Java牛客网社区项目--知识点&面试题 请简要介绍一下你的项目? 什么是Spring框架? 对Sp ...

  8. 【牛客网C++服务器项目学习】-Day09-网络模型个人总结

    项目学习地址:[牛客网C++服务器项目学习] day09 项目学习进入了第四章--网络编程.这一章的学习,前半段是对计算机网络体系进行一个大致的讲解.我自己在今年4月份系统性的看了<计算机网络自 ...

  9. 大数据技术基础综合项目——牛客网招聘岗位统计分析

    大数据技术基础综合项目--牛客网招聘岗位统计分析 文章目录 大数据技术基础综合项目--牛客网招聘岗位统计分析 零.实验环境说明 一.数据集来源及说明 二.数据预处理阶段 2.1 删除空行的数据 2.2 ...

  10. 仿牛客网讨论社区项目—优化网站性能

    性能优化: 1.考虑加入缓存优化 优化热门帖子列表 GitHub中搜索caffeine 在Maven Repository搜索caffeine配置文件,在resources文件包内的pom.xml文件 ...

最新文章

  1. 页面分享怎么知道通过哪条链接进来的_如何制作微信图文链接
  2. java多态口诀,Java之路---Day12(多态),多态Java
  3. linu怎么启动oracle,请问该如何在LINUX下启动ORACLE?
  4. NILMTK在Windows下的安装教程
  5. 牛客网 牛客小白月赛2 H.武-最短路(Dijkstra)
  6. Oracle管理存储架构(二)--Oracle管理数据块空间
  7. 风阻能发电装置叶片的动力学仿真
  8. fileupload控件的属性_WebForm之FileUpload控件(文件上传)
  9. mac空格键跟删除键失灵
  10. 分号与逗号的区别及举例_顿号与逗号与分号间的区别是什么?
  11. 中兴交换机如何查看服务器设备,中兴交换机配置流程和配置命令(参考模板)...
  12. 无人机,diyDrones,3dr,pixhawk,Chris Anderson, 这几个概念是什么关系?
  13. slim的train
  14. 微信名片加好友服务器繁忙,还傻乎乎的微信加好友?这些细节你要注意!
  15. 数据仓库—stg层_数据产品-数据仓库分层建模
  16. 欢场春梦破碎夜 A股暴跌哀鸿遍野 未来投资机会何在?
  17. 计算机整机配置单,小编教你电脑主机配置清单推荐
  18. webgame游戏模式分析二
  19. 代码演示使用Spring框架
  20. 夜,也可以很多彩——夜景拍摄技巧

热门文章

  1. JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】
  2. win10无线投屏_win8/win10笔记本无线投影到电视
  3. 001-markdown简介,插件的下载和导出
  4. ad7606中文资料_AD7606-6 pdf,AD7606-6中文资料,AD7606-6应用电路-华秋商城
  5. C语言学习-翁凯(第五章笔记)
  6. 用PC机实现与ATV12变频器Modbus通信控制电机
  7. python EXCEL表格数据对比
  8. Mac系统, 切换大小写失灵
  9. python tkinter画布_Python tkinter Canvas画布完全攻略(超级详细)
  10. 如何下载m3u8格式视频