「测试线排查的一些经验-中篇」&& 调试日志实战

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 「测试线排查的一些经验-中篇」&& 调试日志实战

上一篇文章讲到了测试线排查的一些经验,上篇文章如:《「测试线排查的一些经验-上篇」&& 后端工程师》,本文主要是讲解一些实战中常用的命令或者一些故障排除方法。

全局搜索文件

其实这个命令有点鸡肋,但还是要介绍一下,比较常用。

find / -name tomcat

该命令是帮助我们直接查询tomcat这个文件在哪个路径下。

查看某端口占用的服务

其实这个信息在上一篇文章讲过,但是这里要做一些补充。

我们可以查看某个端口被哪个服务占用了,比如我们看8089这个端口的占用情况:

netstat -anp | grep 8099

在这一步我们只是查询出占用这个端口的服务进程号,接下来查询该进程号是哪个服务:

ps -ef | grep 11585

查看服务执行日志

我们的jar包放在服务器上启动以后,启动日志通常会放在一个单独的日志文件里,我们可以通过动态查看日志文件来看服务启动情况。

如果说jar包执行久了,这个日志文件的信息就会很多,比如像下面这样:

我们怎么看最新的执行信息呢,我们可以指定行数去查看执行情况。

tail -fn 10 log.txt

当日志 log.txt在服务器上执行的时候,我们通过上面的命令可以动态查看指定的最下面的10行输出日志信息,尽管这个时候服务还在启动,控制台还在打印信息,但是这个信息是动态更新到我们面前了,前提是你用了上面这个命令。

其实上面这个方法特别适用于当我们通过日志进行线上故障的排查!

调试日志框架JUL

对于一个程序员来说,当你接触到日志框架,说明你有经常在线上测试调试程序的需要,而非像以前那样在线下测试程序时到处 System.out。当你的程序上到线上的时候,所有的System.out都会被去掉,这个时候使用日志会更方便一些,你就不用到处删System.out,这也是日志存在的必要。

日志类型

我们谈到的日志主要分为:

  • 调试日志
  • 系统日志

日志框架

目前已知的日志框架如下:

  • JUL 【自带原生、常用】
  • logback
  • log4j
  • log4j2 【性能最好、常用】
JUL

JUL的全称是 java util Logging,属于java原生的日志框架,使用时不需要引入第三方类库,属于学习成本最低的一种框架,能够在小型应用中灵活使用。

case one

Logger其实是一个静态方法,直接调用即可。

其中 Level.INFO是日志级别,这里日志级别有七类,分别是:

public class JULTest {
    public static void main(String[] args) {
        /** 获取日志记录器 */
        Logger logger= Logger.getLogger("JULTest");
        /** 记录日志 */
        logger.info("hi logger");
        /** 记录日志 如上等价 枚举类型 */
        logger.log((Level.INFO),"hi logger");
        String name="linghu";
        Integer age=25;
        /** 通过占位符输出变量值 */
        logger.log(Level.INFO,"用户信息:{0},年龄:{1}",new Object[]{name,age});
        logger.severe("严重错误");
        logger.warning("警告信息");
        logger.info("提示信息");
        logger.fine("调试信息");
        logger.finer("调试信息");
        logger.finest("调试信息");
    }
}
八月 13, 2024 5:01:55 下午 com.linghu.api.JULTest main
信息: hi logger
八月 13, 2024 5:01:55 下午 com.linghu.api.JULTest main
信息: hi logger
八月 13, 2024 5:01:55 下午 com.linghu.api.JULTest main
信息: 用户信息:linghu,年龄:25
八月 13, 2024 5:01:55 下午 com.linghu.api.JULTest main
严重: 严重错误
八月 13, 2024 5:01:55 下午 com.linghu.api.JULTest main
警告: 警告信息
八月 13, 2024 5:01:55 下午 com.linghu.api.JULTest main
信息: 提示信息

可以关闭logger的对象记录器:

logger.setUseParentHandlers(false);

日志配置文件

日志配置文件使用的较多,比较灵活,这个配置文件其实就在JRE里的,不过我在这里拷贝出来做了精简:

handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler
.level= ALL
## 文件处理器
# 输出日志级别
java.util.logging.FileHandler.level=ALL
# 输出日志文件路径
java.util.logging.FileHandler.pattern = ./logs/java%u.log
# 输出日志文件限制大小(50000字节)
java.util.logging.FileHandler.limit = 50000
# 输出日志文件限制个数
java.util.logging.FileHandler.count = 1
# 输出日志格式
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
## 控制台处理器
# 输出日志级别
#java.util.logging.ConsoleHandler.level = OFF
java.util.logging.ConsoleHandler.level = ALL
# 输出日志格式
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

有了这个配置文件,接下来我们就在代码中加入日志的实战:

public class JULTest {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
        Logger logger = Logger.getLogger("JULTest");
        LogManager manager = LogManager.getLogManager();
        manager.readConfiguration(resourceAsStream);
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }
}

我们在代码中动态加载了日志配置文件,这样做的好处是,在测试线调试的时候我们可以全局处理,比如全局关闭日志的记录,这样就有一首歌清清爽爽的控制台啦~

在上面配置中,需要注意:

# 输出日志级别
#java.util.logging.ConsoleHandler.level = OFF
java.util.logging.ConsoleHandler.level = ALL

OFF表示全局关闭日志处理记录; ALL表示全局打开日志处理记录。

日志文件最好做一个备份处理,这样方便我们在测试线进行调试,排查:

# 输出日志文件路径
java.util.logging.FileHandler.pattern = ./logs/java%u.log

这个路径代表了一个相对路径,也就是我们当前项目的根目录的logs文件夹下:

我们可以将日志做几个保留,也就是相当于历史记录备份,这个备份的数量可以自己定义,定义如下:

# 输出日志文件限制个数
java.util.logging.FileHandler.count = 5

其实对于日志文件的使用我觉得差不多就是这样了。感谢大家提出好的意见。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
软件测试的艺术:确保质量的实战策略
在软件开发的舞台上,测试是那把确保每个功能如交响乐般和谐奏响的指挥棒。本文将深入探讨软件测试的重要性、基本类型以及如何设计高效的测试策略。我们将通过一个实际的代码示例,展示如何运用这些策略来提升软件质量和用户体验。
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
32 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
一个测试工程师的实战笔记:我是如何在Postman和Apipost之间做出选择的?
优秀的API测试工具应该具备: 分层设计:既有可视化操作,也开放代码层深度定制 场景感知:自动识别加密需求推荐处理方案 协议包容:不强迫开发者为了不同协议切换工具 数据主权:允许自主选择数据存储位置
36 7
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
103 5
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
96 8
超实用的SpringAOP实战之日志记录
【11月更文挑战第11天】本文介绍了如何使用 Spring AOP 实现日志记录功能。首先概述了日志记录的重要性及 Spring AOP 的优势,然后详细讲解了搭建 Spring AOP 环境、定义日志切面、优化日志内容和格式的方法,最后通过测试验证日志记录功能的准确性和完整性。通过这些步骤,可以有效提升系统的可维护性和可追踪性。
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
100 3
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
1064 1
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
107 1
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
148 2

热门文章

最新文章