Spring应用如何打印access日志和out日志(用于分析请求总共在服务耗费多长时间)

我们经常会被问到这样一个问题。你接口返回的好慢呀,能不能提升一下接口响应时间啊?这个时候我们就需要去分析,为什么慢,慢在哪。而这首先应该做的就是确定接口返回时间过长确实是在服务内消耗的时间。而不是我们将请求发给网关或者nignx,由nignx或者网关转发给我们服务的过程消耗时间。

这个时间我们就需要借助我们的acccess日志和out日志了。

1,借助tomcat实现access日志打印

首先说一点总所周知的内容,我们都知道tomcat是有access日志的,所以简单通过tomcat配置实现应该不难。大概的配置如下,都做了解释说明。


# 开启Tomcat的访问日志
server.tomcat.accesslog.enabled=true# 指定日志文件的路径(例如:在当前项目根目录下生成名为 access.log 的日志文件)
# 指定Tomcat访问日志文件的目录。默认值:logs
server.tomcat.accesslog.directory=./
# 指定Tomcat访问日志文件的前缀。默认值:access_log
server.tomcat.accesslog.prefix=access
# 指定Tomcat访问日志文件的后缀。默认值:.log
server.tomcat.accesslog.suffix=.log# 配置 Tomcat 访问日志文件名中日期部分的格式。默认值是 logback-ext,表示使用 Logback 默认的日期格式
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd# 是用于配置 Tomcat 访问日志的格式模式
# 以下是一些常见的日志模式格式:
# %h:远程主机名
# %l:远程登录名
# %u:远程用户
# %t:日期和时间,使用 Common Log Format 的格式(例如:[10/Oct/2000:13:55:36 -0700])
# %r:请求的第一行
# %s:HTTP状态码
# %b:响应内容长度,以字节为单位(省略则表示 -)
# %{xxx}i:请求头中的指定字段
# %{xxx}o:响应头中的指定字段
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D# Tomcat访问日志文件轮换时是否重命名旧日志文件
# 设置为 true,则旧的访问日志文件在轮换时会被重命名,文件名会添加一个时间戳或者序号作为后缀。
# 如果设置为 false,则旧的访问日志文件不会被重命名,而是直接覆盖或者删除。
server.tomcat.accesslog.rename-on-rotate=false# 用于配置是否在Tomcat访问日志中记录请求的属性。默认为 false。
# 设置为 true,Tomcat访问日志将包含额外的请求属性信息,这些属性信息通常是通过Servlet容器或者应用程序添加到请求中的。
#  这些额外的属性可以包括HTTP请求的各种元数据,例如请求的方法、协议、URI等等
server.tomcat.accesslog.request-attributes-enabled=false# Tomcat访问日志的轮换策略。设置为 true,Tomcat访问日志将在达到一定大小限制时进行轮换,以防止日志文件过大。
#  一旦达到了指定的大小限制,Tomcat会停止往当前日志文件中写入内容,并创建一个新的日志文件继续记录访问日志。
server.tomcat.accesslog.rotate=true# 设置Tomcat访问日志文件的最大大小。可以指定大小,如 10MB 或 100KB,也可以使用 -1 表示不限制大小,默认为 -1。
server.tomcat.accesslog.max-file-size=10MB# 设置HTTP POST请求的最大大小(以字节为单位)。默认值:2097152字节(即2MB)
# server.tomcat.max-http-post-size=# 设置HTTP请求头的最大大小(以字节为单位)。默认值:0(表示不限制大小)
# server.tomcat.max-http-header-size=# 设置URI编码,用于解析URL中的参数。默认值:UTF-8
# server.tomcat.uri-encoding=# 设置Tomcat服务器的最大线程数,用于处理请求。默认值:200
# server.tomcat.max-threads=# 设置客户端和服务器之间的连接超时时间(以毫秒为单位)。默认值:-1(表示不设置超时)
# server.tomcat.connection-timeout=

我们配置好了,然后兴致冲冲地去运行项目一看,发现咋没打印呢,我不是开启了tomcat日志了么?

在 Tomcat 中,访问日志是由 Tomcat 的 AccessLogValve 来处理的,而不是由 Logback。因此,如果已经在 Logback 中配置了日志输出,可能会影响到 Tomcat 的访问日志的输出。

这里可能需要做别的配置,我这里介绍几种方法。

2,借助拦截器interceptor实现

package com.luojie.config.logconfig;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AccessLogInterceptor());}
}
package com.luojie.config.logconfig;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Slf4j
public class AccessLogInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {log.info("From Interceptor Request IN URL: {} - Method: {} -IP:{}", request.getRequestURL(), request.getMethod(), request.getRemoteAddr());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// Do nothing}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// Do nothinglog.info("From Interceptor Request OUT URL: {} - Method: {} -IP:{}", request.getRequestURL(), request.getMethod(), request.getRemoteAddr());}
}

3,借助aop实现

package com.luojie.config.logconfig;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;@Aspect // 表示该类是一个切面类
@Component // 将该类注册为一个bean放入IOC容器
@Slf4j
public class LogAspectConfig {@Autowiredprivate HttpServletRequest request;@Pointcut(value = "execution(* com.luojie.controller.*.*(..))")public void pointcut() {}@Before(value = "pointcut()")public void before(JoinPoint joinPoint) {String name = joinPoint.getSignature().getName(); // 获取方法名Object[] args = joinPoint.getArgs();// 获取参数列表
//        log.info("前置通知: 开启调用,方法名:{}, 参数:{}", name, Arrays.toString(args));log.info(" From AOP Request In URL: {} - Method: {} -IP:{}", request.getRequestURL(), request.getMethod(), request.getRemoteAddr());}@After(value = "pointcut()")public void after(JoinPoint joinPoint) {String name = joinPoint.getSignature().getName(); // 获取方法名
//        log.info("后置通知: 开启调用,方法名:{}", name);log.info(" From AOP Request Out URL: {} - Method: {} -IP:{}", request.getRequestURL(), request.getMethod(), request.getRemoteAddr());}}

aop的使用不知道的可以详细查看Spring AOP(基本认识与使用)-CSDN博客

4,修改logback.xml文件(目的:所有进出日志统一保存到同一个文件且无其它日志)

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 定义输出到控制台的日志记录器 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 设置日志输出格式 --><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<!--            <pattern>${ACCESS_LOG_PATTERN}</pattern>--></encoder></appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/mylog.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><!-- 日志文件名称格式,按日期滚动 --><fileNamePattern>logs/mylog.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern><!-- 最多保留的日志文件数量 --><maxIndex>30</maxIndex><minIndex>1</minIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><!-- 单个日志文件大小,例如: 千字节:10KB 或 10kb;兆字节:10MB 或 10mb;  以及10GB 或 10gb:--><maxFileSize>10MB</maxFileSize></triggeringPolicy><encoder><pattern>%date [%thread] %-5level %logger{35} - %msg%n</pattern></encoder></appender><!--打印数据库连接池日志信息--><logger name="com.zaxxer.hikari" level="DEBUG"/><!--打印sql信息--><logger name="com.luojie.dao" level="DEBUG"/><!--additivity="false" 确保特定类的日志不会传递给跟logger,避免重复输出--><logger name="com.luojie.config.logconfig" level="INFO" additivity="false"><appender-ref ref="FILE"/></logger><!-- 设置根日志级别为 INFO --><root level="INFO"><appender-ref ref="CONSOLE"/> <!-- 将日志输出到控制台 --></root></configuration>

5,查看测试结果

希望对各位看官老爷有帮助,如果可以的话,能否请各位老爷点个赞,关注一下博主呢,在这里非常感谢各位老爷了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串及其应用

内容 编写程序实现字符串的基本运算&#xff1a; (1) 求串的长度、两串连接、串比较、子串匹配&#xff1b; (2) 用库函数直接实现上一步的字符申操作 完整代码 #include <iostream> #include <stdio.h> #include<string.h> using namespace std; #define M…

AI办公自动化:批量在多个Word文档中插入对应图片

工作任务&#xff1a;文件夹中有多个word文档和word文档名称一致的图片&#xff0c;要把这些图片都插入到word文档中 在chatpgt中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;写一个Python脚本&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:…

CSS从入门到精通——背景样式

目录 背景颜色 任务描述 相关知识 背景色 编程要求 背景图片 任务描述 相关知识 背景图片 设置背景图片 平铺背景图像 任务要求 背景定位与背景关联 任务描述 相关知识 背景定位 背景关联 简写背景 编程要求 背景颜色 任务描述 本关任务&#xff1a;在本关…

Pytorch解决 多元回归 问题的算法

Pytorch解决 多元回归 问题的算法 回归是一种基本的统计建模技术&#xff0c;用于建立因变量与一个或多个自变量之间的关系。 我们将使用 PyTorch&#xff08;一种流行的深度学习框架&#xff09;来开发和训练线性回归模型。 二元回归的简单示例 训练数据集&#xff08;可获取&…

【git】 OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

修改/etc/hosts文件&#xff0c;删掉以下 192.30.253.113 github.com 192.30.253.113 github.com 192.30.253.118 gist.github.com 192.30.253.119 gist.github.com #172.24.132.179 gerrit.sdp.nd 140.82.112.25 alive.github.com 140.82.114.6 api.github.com 185.199.110.15…

哪里有海量的短视频素材,以及短视频制作教程?

在当下&#xff0c;短视频已成为最火爆的内容形式之一&#xff0c;尤其是在抖音上。但很多创作者都面临一个问题&#xff1a;视频素材从哪里来&#xff1f;怎么拍摄才能吸引更多观众&#xff1f;别担心&#xff0c;今天我将为大家推荐几个宝藏网站&#xff0c;确保你素材多到用…

【Kafka】Kafka生产者-04

【Kafka】Kafka生产者-04 1. 生产者发送消息流程1.1 发送原理 2. 相关文档 1. 生产者发送消息流程 1.1 发送原理 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。 在 main 线程中创建了一个双端队列 RecordAccumulator。 main 线程将消息发送给…

STM32 MDK Keil5软件调试功能使用(无需连接硬件)

MDK Keil5 在线仿真STM32&#xff08;无需连接硬件&#xff09; 首先点击工具栏的魔术棒配置一下&#xff1a;&#xff08;记得选择自己的STM32芯片类型&#xff09; 开启调试 使用逻辑分析仪查看IO输出 会打开这个界面&#xff0c;点击左边的setup按钮 会打开这个窗口&am…

182.二叉树:二叉搜索树的最小绝对差(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

手把手教你入门vue+springboot开发(三)--登录功能后端

文章目录 前言一、redis安装二、后端代码1.修改application.yml文件2.增加utils文件3.增加Result类4.修改UserController类5.修改UserMapper类6.修改UserService和UserServiceImpl类7.增加LoginInterceptor类8.增加WebConfig类9.修改pom.xml文件 前言 前两篇我们用vuespringbo…

FPGA中复位电路的设计

复位电路也是数字逻辑设计中常用的电路&#xff0c;不管是 FPGA 还是 ASIC 设计&#xff0c;都会涉及到复位&#xff0c;一般 FPGA或者 ASIC 的复位需要我们自己设计复位方案。复位指的是将寄存器恢复到默认值。一般复位功能包括同步复位和异步复位。复位一般由硬件开关触发引起…

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版 1.环境要求 1.1 软件要求 要顺利运行本代码,请按照以下系统要求进行配置 已经测试过的系统 Linux Ubuntu 22.04.5 kernel version 6.7其他系统可能出现系统兼容性问题。 最低要求 该要求仅针对标准模…

oracle中执行select ... for update需要什么权限?

oracle中执行select … for update需要什么权限&#xff1f; 问题 在oracle中&#xff0c;一个用户执行select … for update需要什么权限&#xff1f; 分析测试 用户1&#xff1a; test_0614 用户2&#xff1a;test 目标表&#xff1a;test.t_0614 执行语句&#xff1a;se…

论人工智能与真实性

论人工智能与真实性 这让我们都感到不安:不是因为人工智能已经足够好&#xff0c;可以准确地预测某人可能会如何回答(包括猫的名字、表情符号的使用、汤的参考以及对“精神动物”的随意参考)&#xff0c;而是因为提供这些反应菜单的模式首先代表了对这些互动功能的误解。即使回…

59.指向指针的指针(二级指针)

目录 一.什么是指向指针的指针 二.扩展 三.视频教程 一.什么是指向指针的指针 我们先看回顾一下指针&#xff1a; #include <stdio.h>int main(void) {int a 100;int *p &a;printf("*p is %d\n",*p);return 0;} 解析&#xff1a; 所以printf输出的结…

TCP/IP协议,三次握手,四次挥手

IP - 网际协议 IP 负责计算机之间的通信。 IP 负责在因特网上发送和接收数据包。 HTTP - 超文本传输协议 HTTP 负责 web 服务器与 web 浏览器之间的通信。 HTTP 用于从 web 客户端&#xff08;浏览器&#xff09;向 web 服务器发送请求&#xff0c;并从 web 服务器向 web …

Java 网站开发入门指南:如何用java写一个网站

Java 网站开发入门指南&#xff1a;如何用java写一个网站 Java 作为一门强大的编程语言&#xff0c;在网站开发领域也占据着重要地位。虽然现在 Python、JavaScript 等语言在网站开发中越来越流行&#xff0c;但 Java 凭借其稳定性、可扩展性和丰富的生态系统&#xff0c;仍然…

【CS.AL】算法必学之贪心算法:从入门到进阶 —— 关键概念和代码示例

文章目录 1. 概述2. 适用场景3. 设计步骤4. 优缺点5. 典型应用6. 题目和代码示例6.1 简单题目&#xff1a;找零问题6.2 中等题目&#xff1a;区间调度问题6.3 困难题目&#xff1a;分数背包问题 7. 题目和思路表格8. 总结References 1000.1.CS.AL.1.4-核心-GreedyAlgorithm-Cre…

李永乐线代笔记

线性方程组 解方程组的变换就是矩阵初等行变换 三秩相等 方程组系数矩阵的行秩列秩&#xff0c;线性相关的问题应求列秩&#xff0c;但求行秩方便 齐次线性方程组 对应向量组的线性相关&#xff0c;所以回顾下线性相关的知识&#xff1a; 其中k是x&#xff0c;所以用向…

Leaflet集成wheelnav在WebGIS中的应用

目录 前言 一、两种错误的实现方式 1、组件不展示 2、意外中的空白 二、不同样式的集成 1、在leaflet中集成wheelnav 2、给marker绑定默认组件 2、面对象绑定组件 3、如何自定义样式 三、总结 前言 在之前的博客中&#xff0c;我们曾经介绍了使用wheelnav.js构建酷炫…