当前位置: 首页 > news >正文

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,查看测试结果

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

相关文章:

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

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

SpringBoot整合SpringDataRedis

目录 1.导入Maven坐标 2.配置相关的数据源 3.编写配置类 4.通过RedisTemplate对象操作Redis SpringBoot整合Redis有很多种&#xff0c;这里使用的是Spring Data Redis。接下来就springboot整合springDataRedis步骤做一个详细介绍。 1.导入Maven坐标 首先&#xff0c;需要导…...

电脑怎么录制游戏视频?轻松捕捉每一帧精彩

随着游戏产业的蓬勃发展&#xff0c;越来越多的玩家不仅满足于在游戏世界中的探索与冒险&#xff0c;更希望将自己的游戏精彩瞬间记录下来&#xff0c;分享给更多的朋友。可是电脑怎么录制游戏视频呢&#xff1f;本文旨在为广大游戏爱好者提供一份详细的电脑游戏视频录制攻略&a…...

【Elasticsearch】索引快照并还原到其他集群

【Elasticsearch】索引快照并还原到其他集群 前提&#xff1a;es节点的所有用户id和组id都需要相同&#xff0c;最好在新建集群时指定用户id和组id&#xff0c;否则挂载后执行curl时会提示权限报错。 解决方法&#xff08;gpt生成&#xff09;&#xff0c;不敢在生产尝试。 点…...

QT--DAY1

不使用图形化界面实现一个登陆界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("登录界面");//设置窗口大小this->resize(535,410);//固定窗口大小this->setFixedSize(535,410)…...

DSP教学实验箱_数字图像处理_操作教程:5-1 图像旋转

一、实验目的 学习图像旋转的原理&#xff0c;掌握图像的读取方法&#xff0c;并实现图像旋转。 二、实验原理 图像旋转 图像的旋转是指以图像的某一点为原点以逆时针或顺时针旋转一定的角度。其本质是以图像的中心为原点&#xff0c;将图像上的所有像素都旋转一个相同的角…...

MyBatis总结(2)- MyBatis实现原理(三)

核心配置 JavaBeanMapper.xml&#xff08;sql映射&#xff09; 作用 JavaBeanMapper.xml实现&#xff1a; 用来干什么&#xff1f; 定义Sql语句映射。相对照JDBC的实现&#xff0c;是将原本的Sql代码提取出来&#xff0c;最终根据映射关系执行Sql操作。 好处&#xff1f; 解…...

【保姆级教程】Linux 基于 Docker 部署 MySQL 和 Nacos 并配置两者连接

一、Linux 部署 Docker 1.1 卸载旧版本&#xff08;如有&#xff09; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine1.2 安装 yum-utils 包 sudo yum install -y…...

Dev C++ 安装及使用方法教程-干活多超详细

Dev C 是一款非常好用&#xff0c;简约的C/C开发工具。可以减少很多创建工程的繁琐步骤&#xff0c;很快的进行开发。对于只用于来写代码的人来说&#xff0c;是比较轻量以及极速的。 Dev C 是一个windows下的c和c程序的集成开发环境。它使用mingw32/gcc编译器&#xff0c;遵循…...

无缝滚动的swiper

看效果 看代码 <swiper :indicator-dots"true" :autoplay"true" circular :interval"3000" :duration"6000" display-multiple-items"3" easing-function"linear"><swiper-item v-for"(item,indx…...

tvm实战踩坑

今天玩了一下tvm的安装 我要安装v0.14.0的版本 所以按照官网的方法 https://tvm.apache.org/docs/install/from_source.html#python-package-installation git clone --recursive https://github.com/apache/tvm tvmgit checkout v0.14.0recursive是很重要的 这一步可以替换成…...

计算机网络之网络层知识总结

网络层功能概述 主要任务 主要任务是把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。网络层传输单位是数据报。 分组和数据报的关系&#xff1a;把数据报进行切割之后&#xff0c;就是分组。 主要功能&#xff1a; 路由选择与分组转发 路由器…...

利用穿戴甲虚拟试戴技术提高销量和参与度

在不断变化的美容行业&#xff0c;保持领先意味着拥抱创新技术。其中一项改变游戏规则的技术是人工智能驱动的虚拟指甲试戴。在穿戴甲领域&#xff0c;不断兴起的虚拟试戴技术对促进销售和参与度产生了重大影响。 视觉吸引力的力量 要了解虚拟试戴的重要性&#xff0c;必须了解…...

后端|压缩Base64图片的两种方式

Base64是一种将二进制数据编码为ASCII字符串的方法。它通过将3个字节的二进制数据转换为4个可打印字符的ASCII字符&#xff0c;从而将二进制数据转换为可传输的文本格式。Base64编码常用于传输图片或音频文件。Base64编码可以保证数据在传输过程中不丢失&#xff0c;同时可以避…...

HCIP认证笔记(单选题)

1、OSPF Hello报文中不包括:process ID 3、IS-IS路由的开销在narrow模式下路由的开销值取值范围是:1~63; 在wide模式下路由的开销取值范围为:1~16777215 4、attached-bit advertise never 命令可以使level-1设备不生成缺省路由; 5、OSPFv3报文封装在IPv6报文内,IPv…...

数据结构笔记-2、线性表

2.1、线性表的定义和基本操作 如有侵权请联系删除。 2.1.1、线性表的定义&#xff1a; ​ 线性表是具有相同数据类型的 n (n>0) 个数据元素的有限序列&#xff0c;其中 n 为表长&#xff0c;当 n 0 时线性表是一个空表。若用 L 命名线性表&#xff0c;则其一般表示为&am…...

Linux基础IO【II】真的很详细

目录 一.文件描述符 1.重新理解文件 1.推论 2.证明 2.理解文件描述符 1.文件描述符的分配规则 3.如何理解文件操作的本质&#xff1f; 4.输入重定向和输出重定向 1.原理 2.代码实现重定向 3.dup函数 ​编辑 4.命令行中实现重定向 二.关于缓冲区 1.现象 …...

【C++】模板及模板的特化

目录 一&#xff0c;模板 1&#xff0c;函数模板 什么是函数模板 函数模板原理 函数模板的实例化 推演(隐式)实例化 显示实例化 模板的参数的匹配原则 2&#xff0c;类模板 什么是类模板 类模板的实例化 二&#xff0c;模板的特化 1&#xff0c;类模板的特化 全特化…...

2001-2023年上市公司数字化转型测算数据(含原始数据+处理代码+计算结果)

2001-2023年上市公司数字化转型测算数据&#xff08;含原始数据处理代码计算结果&#xff09;&#xff08;吴非&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、指标:行业代码、行业名称、证券简称、是否发生ST或ST或PT、是否发生暂停上市…...

ICRA 2024:基于视觉触觉传感器的物体表⾯分类的Sim2Real双层适应⽅法

⼈们通常通过视觉来感知物体表⾯的性质&#xff0c;但有时需要通过触觉信息来补充或替代视觉信息。在机器⼈感知物体属性⽅⾯&#xff0c;基于视觉的触觉传感器是⽬前的最新技术&#xff0c;因为它们可以产⽣与表⾯接触的⾼分辨率 RGB 触觉图像。然⽽&#xff0c;这些图像需要⼤…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...