首页 > 其他分享 >AOP实现将入参与出参写入日志文件中,每天生成一个文件

AOP实现将入参与出参写入日志文件中,每天生成一个文件

时间:2023-04-29 11:24:38浏览次数:42  
标签:文件 MM 出参 yyyy 将入 org import logger public

LogAspect 
package org.jeecg.interceptor;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

@Aspect
@Component
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger("WRITER-LOG");

    //设置切入点:这里直接拦截被@ModelView注解的方法
    @Pointcut("@annotation(org.jeecg.interceptor.LogParamRecord)")
    public void pointcut() { }
//    @Pointcut("execution(* org.jeecg.modules.*.*(..))")
//    public void controllerAspect() {}

    @Around("pointcut()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String method = request.getMethod();
        String uri = request.getRequestURI();
        logger.info("Request: {} {}", method, uri);

        Object[] args = joinPoint.getArgs();
        if (args != null && args.length > 0) {
            logger.info("Request params:");
            for (Object arg : args) {
                logger.info("{}", JSON.toJSONString(arg));
            }
        }

        Object result = joinPoint.proceed();

        if (result != null) {
            logger.info("Response params:");
            logger.info("{}", JSON.toJSONString(result));
        }

        return result;
    }
}
LogParamRecord 
package org.jeecg.interceptor;

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})//只能在方法上使用此注解
public @interface LogParamRecord {
}

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 -->
    <property name="LOG_HOME" value="../logs" />
    <!--日志输出位置-->
    <property name="LOG_WRITER" value="D:/zrkj" />

    <!--<property name="COLOR_PATTERN" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''})- %gray(%msg%xEx%n)" />-->
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/jeecgboot-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 生成 error html格式日志开始 -->
    <appender name="HTML" class="ch.qos.logback.core.FileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--设置日志级别,过滤掉info日志,只输入error日志-->
            <level>ERROR</level>
        </filter>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%p%d%msg%M%F{32}%L</pattern>
            </layout>
        </encoder>
        <file>${LOG_HOME}/error-log.html</file>
    </appender>
    <!-- 生成 error html格式日志结束 -->

    <!-- 每天生成一个html格式的日志开始 -->
    <appender name="FILE_HTML" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/jeecgboot-%d{yyyy-MM-dd}.%i.html</FileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
            <MaxFileSize>10MB</MaxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%p%d%msg%M%F{32}%L</pattern>
            </layout>
        </encoder>
    </appender>


    <!-- 按照每天生成日志文件 -->
    <appender name="WRITER-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${LOG_WRITER}/zrkj-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 每天生成一个html格式的日志结束 -->

    <!--myibatis log configure -->
    <logger name="com.apache.ibatis" level="TRACE" />
    <logger name="java.sql.Connection" level="DEBUG" />
    <logger name="java.sql.Statement" level="DEBUG" />
    <logger name="java.sql.PreparedStatement" level="DEBUG" />

    <logger name="WRITER-LOG" level="debug" additivity="false">
        <appender-ref ref="WRITER-APPENDER" />
    </logger>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
        <appender-ref ref="HTML" />
        <appender-ref ref="FILE_HTML" />
    </root>

</configuration>

 

方法一:应用到需要写入日志的方法上注解,方法二:也可以通过拦截包名,实现写入日志。自己修改上面的代码来实现。

@RestController
public class GuangxiYibaoPlatformController {


    @Resource
    private IService iService;

@LogParamRecord
    @PostMapping("/uploadNotice")
    public JSONObject uploadNotice(@RequestBody JSONObject jsonObject) {
        return iService.feeDetailUploadNotice(jsonObject);
    }
}

 

标签:文件,MM,出参,yyyy,将入,org,import,logger,public
From: https://www.cnblogs.com/wangfx/p/17363718.html

相关文章

  • 【SpringBoot 学习】54、Spring Boot 集成 File Storage 实现各个平台文件对象处理
    文章目录SpringBoot集成FileStorageSpringBoot集成FileStorage统一依赖管理<!--spring-file-storage--><spring-file-storage.version>0.7.0</spring-file-storage.version><minio.versioin>8.4.3</minio.versioin>&l......
  • matlab读取文件中时间格式变量并将x轴以时间格式显示
    clcclearcloseall%读取数据文件[num,txt,raw]=xlsread('data.xlsx');%将第一列读进来作为时间dateStrings=raw(2:end,1);%将第一列设置为时间数字格式x_raw=datenum(dateStrings);x=x_raw(:,:);%绘制图像figureholdon%设置图片位置大小set(gcf,'Posit......
  • Win32 API从磁盘文件图片创建工具栏图标
    关键字:Win32API从磁盘,文件,图片创建工具栏图标,包含提示文字。编译命令:g++demo01.cpp-mwindows-lcomctl32-ldwmapi-odemo01-static-Wall-std=c++11#defineUNICODE#include<Windows.h>#include<strsafe.h>#include<commctrl.h>/******CALLBACK代表__stdcall......
  • 虚拟文件系统和文件系统的区别和联系
    虚拟文件系统和文件系统是操作系统中的两个重要概念,它们有以下区别和联系:区别:文件系统是实际存储和管理文件的系统,而虚拟文件系统则是对文件系统的抽象和统一表示,使得应用程序可以不用考虑底层文件系统的细节。文件系统包含了文件的物理存储结构,而虚拟文件系统则是对文件的......
  • JVM系列——java文件到JVM中的整个过程
    关注“Java后端技术栈“回复“面试”获取最新资料今天来聊聊从java文件到class文件,最后class文件是怎么到JVM中的。首先是编写一个HelloWorld.java类,然后通过这一系列的编译操作,最终成了HelloWorld.class文件。然后把HelloWorld.class文件加载到JVM中的整个过程:1,装载。查找和导入cl......
  • python日常工作处理-文件按比例分割数据
    python日常工作处理-文件按比例分割数据把一个保存用户id文本进行比例分割,比例为50%,分别另存为另外两个文件代码importrandominput_file='/Users/Desktop/2023-03-28.txt'group1_file='/Users/Desktop/group1_2023-03-28.txt'group2_file='/Users/Desktop/group2_......
  • 超大文件上传和断点续传的实例解析
    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。ASP.NET页面设计:TextBox和Button按钮。TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实现选择文件夹......
  • Java 读取UTF-8文件中文乱码
    Java读取UTF-8文件中文乱码 InputStreamReaderisr=newInputStreamReader(newFileInputStream(file),"UTF-8");BufferedReaderread=newBufferedReader(isr);  例如:privatestaticStringreadUTF8File(StringfilePath)throwsIOException{ InputStreamReaderi......
  • Liunx中使用expr命令并结合sed计算文件中的数字
    Liunx中使用expr命令并结合sed计算文件中的数字  数据样例:已选择153682行。已选择539794行。已选择627588行。 echo计算所有已选择的数据总共有多少条记录sed-n'{/已选择/s/[^0-9]*//gp}'exp.txt|sed-n's/[0-9]*/&/;:a;$!N;/[0-9]*/s/\n/+/;ta;P;D'|xargsexpr......
  • 超大文件上传和断点续传的示例
    ​ 需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify......