log.file 弃用的情况下,包括日志文件的相关springboot项目调试技巧

简介: 所有代码均有相关介绍。本文将阐述 springboot 下应该如何进行从日志打印、保存、管理等等的日志技巧,到常用编辑器 IDEA 断点生成、操作、管理等等的后端调试技巧,最后到谷歌浏览器的相关的前端

👏 Hi! 我是 Yumuing,一个技术的敲钟人

👨‍💻 每天分享技术文章,永远做技术的朝拜者

📚 欢迎关注我的博客:Yumuing's blog

所有代码均有相关介绍。本文将阐述 springboot 下应该如何进行从日志打印、保存、管理等等的日志技巧,到常用编辑器 IDEA 断点生成、操作、管理等等的后端调试技巧,最后到谷歌浏览器的相关的前端调试技巧,基本能够满足项目基本的调试需要,里面的相关代码文件都可以作为模板使用,只需要修改部分参数即可适用。

日志错误信息:logback

注:使用的是 slf4j 进行日志管理,log.file 已被弃用,使用 yml 进行配置较为简单,但不能满足很多需求,所以采用 xml 的文件进行配置,所有代码均有相关介绍。
application.yml:level 跟的是包名,用来指定某个包下的日志显示级别

# Logger 配置:slf4j
logging:
  level.top.yumuing.community: info
  file:
    name: logs/community.log

其中, logging.file 在 2.2 中已弃用,并在 2.3 中完全删除,因此不能再在 2.3+ 中使用,得使用logging.file.name,logs/community.log 表示项目根目录下的 logs/ 创建community.log 来保存日志文件

测试方法:

package top.yumuing.community;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
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 LoggerTest {
   
   

    private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

    @Test
    public void testLogger(){
   
   
        System.out.println(logger.getName());

        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }

}

使用 xml 进行详细日志文件配置。

先在 application.yml 配置启动 xml 文件:

logging:
  config: classpath:logback-spring.xml

logback-spring.xml:注意修改路径、包名、文件大小即可,按需修改,无需记忆。

  • <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">:设置 logback 规则名称,以便后续启用该规则

  • <property name="LOG_PATH" value="data"/>:主日志文件目录位置为项目根目录下 date/logs/*.log

  • <property name="APPDIR" value="logs"/>:logs 可自行设置为程序名,统一管理所有程序日志文件,也可保持不变,保存在 LOG_PATH 下的 logs 目录
  • <file>${LOG_PATH}/${APPDIR}/log_error.log</file>:可自行选择注释还是保留,如果保留,则存入 log_error.log 直至文件限制,才会重新生成日志文件,否则为 <fileNamePattern> 的格式
  • <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>:按文件名 log-error-生成日期.第几个.log 命名
  • <maxFileSize>5MB</maxFileSize>:文件一旦超过 5mb 即重新创建次序加一的文件,再次写入
  • <maxHistory>30</maxHistory>:日志文件保存时间
  • <append>true</append>:以追加的形式写入文件,而不是覆盖形式
  • <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>:日志内容文本写入格式,日期 级别 [线程 日志所处的类 哪个文件代码第几行] 详细日志信息
  • <charset>utf-8</charset>:写入格式
  • <level>error</level>:把以上规则应用到哪个日志的级别
  • <onMatch>ACCEPT</onMatch>:匹配则写入日志
  • <onMismatch>DENY</onMismatch>:不匹配则拒绝写入
  • console 部分是把日志打印到控制台
  • <logger name="top.yumuing.community" level="debug"/>:限制日志显示打印级别,top.yumuing.community 包下级别为 debug
  • <root level="info">:项目根目录下的包默认日志显示级别为 info,有设置包级别以设置为主,否则默认
  • <appender-ref ref="FILE_ERROR"/>:启用 FILE_ERROR 规则
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <contextName>community</contextName>
    <property name="LOG_PATH" value="data"/>
    <property name="APPDIR" value="logs"/>

    <!-- 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="top.yumuing.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>

HTTP 常用状态码解释

状态码 使用场景 示例
302:重定向 在访问完一个接口后,返回 302 及建议请求其他接口的地址,避免产生过多依赖耦合 访问完删除接口后,返回 302,查询接口地址,使得浏览器会在访问完 302 后去访问查询接口,以得到删除后的数据列表,而不是在删除方法中调用查询方法,导致过多依赖耦合,即修改完其中一个方法,就得考虑调用它的方法是否还适用
404:资源访问错误 浏览器未访问到所需资源,可能是由地址输入错误或者服务器路径相关代码错误导致的 默认错误页面的错误码,访问功能不存在,往往是路径书写错误
500:服务器接收到请求却处理错误 浏览器正确将请求发送到服务器。但服务器处理时间过长,或者处理错误 访问服务器性能不足(可能性较小),接口无法处理该请求(可能性较大)。修改服务端程序。

IDEA 项目断点调试

可以在你想要调试的地址左侧,单击鼠标打好断点,如下

image-20230228092211824

再选择运行模式为 Debug 模式,快捷键 Shift + F9,正常运行模式是不会停止在断点代码处

image-20230228092101814

从断点行开始执行代码的常见按钮及快捷键

image-20230228093041757

image-20230228094951271

按钮顺序 功能描述 快捷键
01 执行当前行下一条代码 F8
02 执行当前行所调用的方法内部的下一条代码 F7
07 执行到下一个断点处:如果某个循环一步步执行太麻烦,可以选择设你想要跳转的断点处,打好断点,按绿色按钮跳转到断点处。如果后续代码没有断点,直接执行结束 F9

调试时,会在需要参数处,以灰色字体显示对应值或该集合长度

image-20230228093757192

在此处,显示参数完整信息

image-20230228094745606

断点管理位置:第四个按钮:红色双圆点

image-20230228095613850

打开界面如下:

管理断点界面.webp

客户端、浏览器调试

此处为前端代码,调试的常常为 js 文件。浏览器按 F12,调出调试界面

image-20230228100733922

选择为 source 功能栏,再选择对应 js 文件,单击左侧,产生蓝色箭头即可。

image-20230228100923556
开始运行调用代码,显示为这个,即为打断点成功。

快捷键:

F10:向下执行一行

F11:进入到某个方法内部执行代码

F8:执行到下一个断点处或执行到底

Breakpoints:管理断点处

image-20230228101336699

此处查看参数值

image-20230228101853253

如果没有想要查看的参数值,可选中想要查看的元素位置,右键选中此图最后一个:Add selected text to watchs

image-20230228101624295

此处查看选中的对应值

image-20230228101750184

求点赞

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
3月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
123 2
|
4月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
668 5
|
6月前
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
1031 5
|
6月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
341 3
|
6月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
559 3
|
6月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
275 0
|
6月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
505 0
|
8月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
848 54
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
381 9

热门文章

最新文章