springboot学习(五十四)springboot中记录审计访问日志

springboot学习(五⼗四)springboot中记录审计访问⽇志在web项⽬中记录每个接⼝的访问信息做审计是很重要的,下⾯介绍使⽤log4j2+将⽇志记录到⽇志⽂件的⼀种⽅式。
1、编写记录⽇志实体类AccessLog
package;
import Data;
import Accessors;
import Date;
/**
* 访问⽇志的实体
日志审计*
* @author zhuquanwen
* @vesion 1.0
* @date 2021/8/29 20:37
* @since jdk1.8
*/
@Data
@Accessors(chain =true)
public class AccessLog {
/**访问⽤户*/
private String username ="unknown";
/**uri*/
private String uri;
/**访问时长*/
private Long duration;
/**请求⽅式*/
private String method;
/**客户端IP*/
private String ip;
/**状态码*/
private int status;
/**时间*/
private Date createTime;
}
2、编写
这⾥在preHandle中构建基础AccessLog的属性和请求时间并将它们绑定到request中,在postHandle中从request中取出AccessLog并设置访问耗时、访问⽤户等属性,注意:这⾥的访问⽤户的获取⽅式是我项⽬中的⽅式,根据实际情况要做修改。
设置完所有AccessLog的属性后,使⽤log.debug输出⽇志。
import AuthContext;
import AuthContextHolder;
import SpringUtils;
import AccessLog;
import Slf4j;
import Nullable;
import Component;
import HandlerInterceptor;
import ModelAndView;
import HttpServletRequest;
import HttpServletResponse;
import Date;
/**
* 访问/审计⽇志
* @author zhuquanwen
* @vesion 1.0
* @date 2021/8/29 20:42
* @since jdk1.8
*/
@Slf4j
public class AccessLogInterceptor implements HandlerInterceptor {
/**访问开始时间*/
private static final String KEY_REQUEST_START_TIME ="KEY_REQUEST_START_TIME";
/**访问开始时间*/
private static final String KEY_ACCESS_LOG ="KEY_ACCESS_LOG";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
AccessLog accessLog =new AccessLog();
accessLog.IpAddr())
.Method())
.RequestURI());
//将信息绑定在request中
request.setAttribute(KEY_REQUEST_START_TIME, System.currentTimeMillis());
request.setAttribute(KEY_ACCESS_LOG, accessLog);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView)throws Exception {
AccessLog accessLog =(AccessLog) Attribute(KEY_ACCESS_LOG);
Long startTime =(Long) Attribute(KEY_REQUEST_START_TIME);
if(accessLog !=null){
Date createTime =new Date();
AuthContext context = Context();
accessLog.setCreateTime(createTime)
.Time()- startTime)
.Status())
.setUsername(context ==null?null: Username());
log.String());
}
}
}
3、注册
import AccessLogInterceptor;
import Configuration;
import InterceptorRegistry; import ResourceHandlerRegistry; import ViewControllerRegistry; import WebMvcConfigurer;
/**
*
* @author zhuquanwen
* @vesion 1.0
* @date 2021/8/29 21:02
* @since jdk1.8
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry){
// 添加,配置拦截地址
registry.addInterceptor(new AccessLogInterceptor())
.addPathPatterns("/**");
//                .excludePathPatterns("/login","/userLogin")
//                .excludePathPatterns("/image/**");
}
}
4、配置log4j2对审计⽇志的⽀持
log4j2的配置⽅式见上⼀篇⽂章介绍:
在上⼀篇的配置基础上,添加审计⽇志的RollingFile,⽇志级别为debug
<!--访问⽇志-->
<RollingFile name="accessAppender"
fileName="${FILE_PATH}/${FILE_NAME}/log_access.log"
filePattern="${FILE_PATH}/${FILE_NAME}/access/log-access-%d{yyyy-MM-dd}_%"
append="true">
<!--设置⽇志格式-->
<PatternLayout pattern="${ACCESS_LOG_PATTERN}"charset="UTF-8"/>
<Filters>
<ThresholdFilter level="debug"onMatch="ACCEPT"onMismatch="DENY"/>
</Filters>
<Policies>
<!-- 基于时间的触发策略。该策略主要是完成周期性的log⽂件封存⼯作。有两个参数:
interval,integer型,指定两次封存动作之间的时间间隔。单位:以⽇志的命名精度来确定单位,
⽐如yyyy-MM-dd-HH 单位为⼩时,yyyy-MM-dd-HH-mm 单位为分钟
modulate,boolean型,说明是否对封存时间进⾏调制。若modulate=true,
则封存时间将以0点为边界进⾏偏移计算。⽐如,modulate=true,interval=4hours,
那么假设上次封存⽇志的时间为00:00,则下次封存⽇志的时间为04:00,
之后的封存时间依次为08:00,12:00,16:00-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy 属性如不设置,则默认为最多同⼀⽂件夹下当天 7 个⽂件后开始覆盖-->
<DefaultRolloverStrategy max="30">
<!-- 删除处理策略,在配置的路径中搜索,maxDepth 表⽰往下搜索的最⼤深度 -->
<Delete basePath="${FILE_PATH}/${FILE_NAME}/"maxDepth="2">
<!-- ⽂件名搜索匹配,⽀持正则 -->
<IfFileName glob="*."/>
<!--!Note: 这⾥的 age 必须和 filePattern 协调, 后者是精确到 dd, 这⾥就要写成 xd, xD 就不起作⽤
另外, 数字最好 >2, 否则可能造成删除的时候, 最近的⽂件还处于被占⽤状态,导致删除不成功!-->
<!--7天-->
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
ACCESS_LOG_PATTERN的格式如下:
<!--变量配置-->
<properties>
<!-- 格式化输出:%date 表⽰⽇期,%thread 表⽰线程名,%-5level:级别从左显⽰ 5 个字符宽度 %msg:⽇志消息,%n 是换⾏符-->
<!-- %logger{36} 表⽰ Logger 名字最长 36 个字符 -->
<property name="LOG_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] - %msg%n"/>
<property name="LOG_CONSOLE_PATTERN"value="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{} }{bright,yellow}: %msg%n%style{%throwable}{red}"/>
<property name="ACCESS_LOG_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n"/>
<!-- 定义⽇志存储的路径 -->
<property name="FILE_PATH"value="logs"/>
<property name="FILE_NAME"value="newframe"/>
</properties>
将类单独配置⼀个Logger:
<AsyncLogger name="com.fig.log.AccessLogInterceptor"level="debug"includeLocation=
"true"additivity="false"> <AppenderRef ref="accessAppender"/>
<AppenderRef ref="consoleAppender"/>
</AsyncLogger>
⼤功告成,看下我⽣成的access_log.log⽂件:
2021-08-2921:11:36.822- AccessLog(username=null, uri=/demo/ttt, duration=7, method=GET, ip=0:0:0:0:0:0:0:1, status=404, createTime=Sun Aug 2921 :11:36 CST 2021)
2021-08-2921:11:39.639- AccessLog(username=null, uri=/demo/404, duration=23, method=GET, ip=0:0:0:0:0:0:0:1, status=404, createTime=Sun Aug 29 21:11:39 CST 2021)

本文发布于:2024-09-21 13:30:12,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/386704.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:时间   访问   配置   封存   策略   删除
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议