为你的项目配置日志(AOP+logback)

news2025/1/10 22:02:21

文章目录

    • 1、导入依赖
    • 2、配置文件logback-spring.xml
    • 3、使用AOP做日志
      • 3.1、自定义注解
      • 3.2、自定义aop切面
    • 4、在controller方法上添加注解
    • 5、使用@Slf4j
    • 6、最终参考效果

之前看过logback的配置方法,今天整理spring的知识的时候,又看到了aop,想着把他两个弄起来,打印在控制台的信息,比较好看,顺便也能写在日志文件中,我也不知道这样做好不好,反正是做个小记录!

1、导入依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、配置文件logback-spring.xml


修改路径、日志文件名啥的,然后将该配置文件放到resources目录下

<!--
configuration 有三个属性:
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!--    &lt;!&ndash; 定义日志文件名称 &ndash;&gt;-->
<!--    <property name="APP_NAME" value="codecatlog" />-->
    <!-- 定义日志文件的路径 -->
    <property name="LOG_PATH" value="${user.dir}/logs" />
    <!-- 定义日志的文件名 -->
    <property name="LOG_FILE" value="${LOG_PATH}/log_name.log" />

    <!-- 滚动记录日志,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="APPLICATION"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定日志文件的名称 -->
        <file>${LOG_FILE}</file>
        <!--
          当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
          TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。
          -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--
           滚动时产生的文件的存放位置及文件名称
           %d{yyyy-MM-dd}:按天进行日志滚动
           %i:当文件大小超过maxFileSize时,按照i进行文件滚动
           -->
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--
           可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
           且maxHistory是7,则只保存最近7天的文件,删除之前的旧文件。
           注意,删除旧文件时,那些为了归档而创建的目录也会被删除。
           -->
            <maxHistory>7</maxHistory>
            <!--
           当日志文件超过maxFileSize指定的大小时,根据上面提到的%i进行日志文件滚动
           注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,
           必须配置timeBasedFileNamingAndTriggeringPolicy
           -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志输出格式: -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </layout>
    </appender>
    <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--
       日志输出格式:
           %d表示日期时间,%green 绿色
           %thread表示线程名,%magenta 洋红色
           %-5level:级别从左显示5个字符宽度 %highlight 高亮色
           %logger{36} 表示logger名字最长36个字符,否则按照句点分割 %yellow 黄色
           %msg:日志消息
           %n是换行符
       -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%magenta(%thread)] %highlight(%-5level) %yellow(%logger{36}): %msg%n</pattern>
        </layout>
    </appender>

    <!--
   root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
   要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。
   -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="APPLICATION" />
    </root>
</configuration>
<!-- 定义日志文件的路径 -->
<property name="LOG_PATH" value="${user.dir}/logs" />
<!-- 定义日志的文件名 -->
<property name="LOG_FILE" value="${LOG_PATH}/log_name.log" />

可以修改这两个东西,可以通过下面的方法看看路径啥的是否正确

public static void main(String[] args) {
    System.out.println(System.getProperty("user.dir"));
}

3、使用AOP做日志

3.1、自定义注解

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD})
@Documented
public @interface WebLog {
}

3.2、自定义aop切面

@Aspect
@Component
public class WebLogAspect {
    private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
	// 下面这个com.customInterface.WebLog要修改成你对应自定义注解的路径
    @Pointcut("@annotation(com.customInterface.WebLog)")
    public void webLog() {}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws JsonProcessingException {
        ServletRequestAttributes requestAttributes
                = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();

        // 打印请求相关参数
        logger.info("========================================== Start ==========================================");
        // 打印请求 url
        logger.info("URL            : {}", request.getRequestURL().toString());
        // 打印 Http method
        logger.info("HTTP Method    : {}", request.getMethod());
        // 打印调用 controller 的全路径以及执行方法
        logger.info("Class Method   : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
        // 打印请求的 IP
        logger.info("IP             : {}", request.getRemoteAddr());
        // 打印请求入参
        logger.info("Request Args   : {}",new ObjectMapper().writeValueAsString(joinPoint.getArgs()));
    }

    @After("webLog()")
    public void doAfter(){
        // 结束后打个分隔线,方便查看
        logger.info("=========================================== End ===========================================");
    }

    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //开始时间
        long startTime = System.currentTimeMillis();
        Object result = proceedingJoinPoint.proceed();
        // 打印出参
        logger.info("Response Args  : {}", new ObjectMapper().writeValueAsString(result));
        // 执行耗时
        logger.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime);
        return result;
    }
}

4、在controller方法上添加注解

public class testController{
    @Autowired
    private Test test;

    @PostMapping("/test")
    @WebLog()
    public ResponseVO test(@RequestBody TestPojo test){
        return test.test(test);
    }
}

类似这样

5、使用@Slf4j

在类上导入@Slf4j,然后使用log.info();去替代System.out.println();

6、最终参考效果

跑在ubuntu上的程序


控制台打印:
在这里插入图片描述


日志文件
在这里插入图片描述
在这里插入图片描述

成功记录!

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

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

相关文章

Linux之系统信息和性能监测

一、前言 安装完一套linux操作系统我们首先得知道系统都有哪些信息&#xff0c;比如安装内存多少、磁盘多大、什么版本、多少核CPU等等&#xff0c;因此熟悉常用的查看系统信息的指令还是很有必要的。 此文档主要对已安装的linux系统的属性有个初步的认识&#xff0c;介绍系统…

一起从根上学习Swoole

一起从根上学习Swoole Swoole&#xff0c;这个名字已经不再是一个简单的扩展库&#xff0c;而是一种让PHP开发者们心驰神往的技术。它是一个基于事件驱动的异步网络通信框架&#xff0c;能够让PHP应用程序在高并发环境下实现卓越的性能表现。现在&#xff0c;你也可以像一名高…

ROS:DWA算法解析、move_base导航包DWA源码解析

一.整体思路 1.基于速度控制运动模型 假设没有噪声&#xff0c;控制时间间隔为内机器人速度v和角速度w保持不变&#xff0c;则机器人围绕半径为r的圆周运动。 其中&#xff0c;。 根据v 和w即可预测出下一次机器人位姿&#xff08;x、y、&#xff09;&#xff0c;根据此也可以…

毕业4年,克服三次瓶颈,最终成功从字节跳动成功跳到阿里!经验分享

介绍下自己的测试历程吧&#xff0c;普通本科&#xff0c;毕业4年&#xff0c; 去年成功转型测试开发&#xff0c;总结一下测试心得。 平凡的大学生活 我大学期间属于并没有什么出众的&#xff0c;按部就班&#xff0c;老实办事的那种学生&#xff0c;我导师对我们那届的学生…

iOS 17(SwiftUI 5.0)带来的图表(Charts)新类型:“大饼”与“甜甜圈”

概览 WWDC 2023 为我们带来了 iOS 17&#xff0c;也为我们带来了 SwiftUI 5.0。 在 SwiftUI 新版中&#xff0c;Apple 增加了很多重磅功能&#xff0c;也对原有功能做了大幅度升级。 对于 Charts 框架&#xff0c; 新增了饼图&#xff08;Pie&#xff09;类型并且加入了图…

容器镜像差异分析工具 container-diff

概述 container-diff 是google出的一个容器差异比较工具&#xff0c;通过这个工具可以比较两个镜像之间存在的文件差异、RPM包差异、apt包差异、pip包差异和node包差异。 container-diff 也包括了对单个镜像分析能力&#xff0c;像文件分析啊、apt包、rpm包分析等功能。 在日常…

Python爬虫——怎么搭建和维护一个本地IP池

目录 背景 一、什么是本地代理IP池 二、代理IP池功能架构图 三、各个组件功能说明及示例代码 1. IP池管理器 2. 代理IP获取器 3. IP质量检测器 4、数据存储器 5、API接口层 6、应用程序 总结 背景 在我们进行爬虫工作时&#xff0c;经常需要使用代理IP。大多数代理…

unity2d粒子特效

文章目录 前言先看效果一、2d平台雨1. 配置2. 图片素材3. 最终效果 二、脚步灰尘效果1. 配置2. 代码调用3. 效果 三、受伤血液四溅效果1. 配置2. 效果 待续四、工程源码五、参考六、完毕 前言 我只是我抽空写了一些简单的2d粒子特效&#xff0c;后面如果接触新的不错的2d特效&a…

Maven 安装

一. 下载 apache官网下载 Maven&#xff1a;Maven – Download Apache Maven &#xff0c;根据需要下载不同压缩包。 将压缩包进行解压&#xff0c;最好放在无中文目录下解压。 二. 安装 三. 配置 1. 配置maven本地仓库 打开解压后的文件夹&#xff0c;找到conf文件夹&#…

银行vr元宇宙全景虚拟展馆提供更加真实、立体、高效的数字资产交易场景

为了贯彻国家普惠金融政策&#xff0c;使金融如无惠及广大群体,宇宙技术在金融行业中的应用将进一步提升金融消费体验感觉和金融管理水平。打造元宇宙金融服务平台&#xff0c;构建虚实结构的金融服务世界&#xff0c;培育和管理好数字机器人员工队伍&#xff0c;提升金融业务各…

postman登录鉴权之接口测试

一.背景 在做接口测试的时候&#xff0c;有些接口向后台请求数据的时候&#xff0c;是需要用户在登录情况下才有数据返回。 以电商平台为例&#xff0c;用户的个人中心&#xff0c;用户的订单列表&#xff0c;用户的支付信息等等&#xff0c;所有用户维度的数据都是需要登录态…

Django - 页面静态化和crontab定时任务(二)

一. 前言 一个网页会有很多数据是不需要经常变动的&#xff0c;比如说首页&#xff0c;变动频率低而访问量大&#xff0c;我们可以把它静态化&#xff0c;这样就不需要每次有请求都要查询数据库再返回&#xff0c;可以减少服务器压力 我们可以使用Django的模板渲染功能完成页面…

app反编译查看是否被混淆或者混淆是否成功

同时打 debug包和release包&#xff0c;生成的目录在build->output文件夹下面 一般直接运行的apk 包是在build/intermediates/apk/debug 目录下 方法1&#xff1a;Android studio 安装插件jadx build成apk 后 直接选中 右键 在Jadx GUI中反编译 就可以查看代码 方法2&…

距离保护的影响因素

1、汲出电流和助增电流的影响 当保护安装处与故障点之间有分支电源时&#xff0c;如图所示&#xff0c;分支电源将向故障点K送短路电流ICB&#xff0c;使流过故障线路的电流IBKIAB ICB&#xff0c;大于实际流过保护1的电流IAB&#xff0c;所以ICB称作助增电流。 由于助增电流的…

第一章操作系统引论

目录 一、熟悉的操作系统 二、计算机系统的层次结构 三、操作系统的概念 四、操作系统的功能 4.1 系统资源的管理者 4.2 向上层提供方便易用的服务 4.2.1 GUI&#xff1a;图形化用户接口&#xff08;Graphical UserInterface&#xff09; 4.2.2 命令接口 4.2.3 程序接…

当杠精型AI丈夫遇上阴阳怪气AI老婆,你的代码玩得转吗?

玩趣味活动 赢千元奖金 DataFountain社区首个趣味活动来啦&#xff01;&#xff01;&#xff01; 活动已发车&#xff0c;来不及解释了&#xff0c;先上车&#xff1a;https://www.datafountain.cn/information/activity/3 人工智能问答爆火&#xff0c;你的算法技能储备跟上…

达梦数据库ODBC配置及达梦与mysql创建DBLINK测试

目录 官网ODBC配置... 3 1、ODBC下载官网... 3 2、上传安装包并解压... 3 3、安装odbc. 3 4、安装依赖... 4 5、再次执行安装即可... 4 6、查看版本及配置文件... 4 Mysql-ODBC配置... 5 一、达梦服务器... 5 1、下载odbc包... 5 2、安装... 6 3、报错... 6 4、先…

STM32——01-开发软件Keil5及STM32CubeMX的安装

1.1开发环境的安装 编程语言&#xff1a;C语言 需要安装的软件有两个&#xff1a;Keil5和STM32CubeMX 安装 安装包&#xff08;不需要太新&#xff0c;以 MDK324 为例&#xff0c;最新的 MDK327 有问题&#xff09; 安装过程一路下一步即可&#xff08;建议不要安装在 C …

Gitlab集成jira

实现功能 gitlab提交和合并分支&#xff0c;会自动将comment信息提交到JIRA上的相关问题的页面gitlab可以修改jira上问题的状态 集成说明 gitlab集成Jira 按项目集成&#xff0c;因此gitlab上的每个项目对应jira上的对应项目由项目管理员&#xff08;一般为接口人&#xff…

如何用Python开发QQ机器人

前言 虽然该文最终是达到以python开发mirai机器人的目的&#xff0c;但起步教程&#xff0c;尤其是环境配置上仍然有大量的相同操作&#xff0c;对其他编程语言仍有借鉴之处 假设你已经安装好了 Java、Python等运行必须的环境 mirai生态 mirai官方生态文档 要使用mirai开发…