Comments (11)
有没有相关实现demo参考一下
from log-record.
获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip
图里的只是使用的示例,并不是实际我的代码。
你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。
你网上搜类似的文章很多的:
https://www.cnblogs.com/ying-dong/p/12329085.html
from log-record.
获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip
图里的只是使用的示例,并不是实际我的代码。
你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。
你网上搜类似的文章很多的:
我的意思其实是拦截到request对象,传递日志处理那一级进行统一处理,主要是想利用框架带来的便利
from log-record.
获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip
图里的只是使用的示例,并不是实际我的代码。
你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。
你网上搜类似的文章很多的:
https://www.cnblogs.com/ying-dong/p/12329085.html我的意思其实是拦截到request对象,传递日志处理那一级进行统一处理,主要是想利用框架带来的便利
其实比较灵活,举例几种方式:
第一种方式:在你能拿到Request的地方,直接用例如LogRecordContext.putVariable("ip", ip);
,放入框架的上下文,这样的好处是写入这个键值对后,在任何地方你都能拿到这个上下文,包括注解中的SpEL表达式里,也可以是在 你实现 IOperationLogGetService接口处理LogDTO的时候拿。坏处是这样会耦合业务代码中了,有一点耦合性。
第二种方式:在你IOperationLogGetService接口的实现里,通过上面说的从servlet里取或者从spring里面直接取到你要的request里的信息,比如IP地址等,拿到后直接写到logDTO的某个地方(由于IOperationLogGetService也是个spring托管的bean,所以你能正常使用spring的特性)。坏处是最好把消息处理的线程池关闭(log-record.thread-pool.enabled=false),改用主线程执行logDTO的处理,否则可能由于切换了线程,导致从servlet里取request或者一些其他方式取request会失效(因为请求进来的线程和我处理logDTO的线程已经不一样了,尽管我用了TransmittableThreadLocal,但不能保证所有父线程的上下文都集成到了子线程)
from log-record.
@Component
public class CustomFuncTestOperationLogGetService implements IOperationLogGetService {
@Override
public void createLog(LogDTO logDTO) {
log.info("logDTO: [{}]", JSON.toJSONString(logDTO));
// 处理logDTO的地方,你可以在这里统一写入request信息到logDTO的特定字段里,写入哪个字段就看你需求了
}
}
from log-record.
获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip
图里的只是使用的示例,并不是实际我的代码。
你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。
你网上搜类似的文章很多的:
https://www.cnblogs.com/ying-dong/p/12329085.html我的意思其实是拦截到request对象,传递日志处理那一级进行统一处理,主要是想利用框架带来的便利
其实比较灵活,举例几种方式:
第一种方式:在你能拿到Request的地方,直接用例如
LogRecordContext.putVariable("ip", ip);
,放入框架的上下文,这样的好处是写入这个键值对后,在任何地方你都能拿到这个上下文,包括注解中的SpEL表达式里,也可以是在 你实现 IOperationLogGetService接口处理LogDTO的时候拿。坏处是这样会耦合业务代码中了,有一点耦合性。第二种方式:在你IOperationLogGetService接口的实现里,通过上面说的从servlet里取或者从spring里面直接取到你要的request里的信息,比如IP地址等,拿到后直接写到logDTO的某个地方(由于IOperationLogGetService也是个spring托管的bean,所以你能正常使用spring的特性)。坏处是最好把消息处理的线程池关闭(log-record.thread-pool.enabled=false),改用主线程执行logDTO的处理,否则可能由于切换了线程,导致从servlet里取request或者一些其他方式取request会失效(因为请求进来的线程和我处理logDTO的线程已经不一样了,尽管我用了TransmittableThreadLocal,但不能保证所有父线程的上下文都集成到了子线程)
这两种方式我感觉有时候并不是最佳实践,我感觉好的方式是在LogDTO增加request对象,方便用户进行个性化处理
from log-record.
@Component public class CustomFuncTestOperationLogGetService implements IOperationLogGetService { @Override public void createLog(LogDTO logDTO) { log.info("logDTO: [{}]", JSON.toJSONString(logDTO)); // 处理logDTO的地方,你可以在这里统一写入request信息到logDTO的特定字段里,写入哪个字段就看你需求了 } }
我现在使用的是1.5.1版本,返回值已经是布尔了
/**
-
SPI:操作日志本地处理
*/
public interface IOperationLogGetService {/**
- 自定义日志监听
- @param logDTO 日志传输实体
*/
boolean createLog(LogDTO logDTO) throws Exception;
}
from log-record.
@Component public class CustomFuncTestOperationLogGetService implements IOperationLogGetService { @Override public void createLog(LogDTO logDTO) { log.info("logDTO: [{}]", JSON.toJSONString(logDTO)); // 处理logDTO的地方,你可以在这里统一写入request信息到logDTO的特定字段里,写入哪个字段就看你需求了 } }
我现在使用的是1.5.1版本,返回值已经是布尔了 /**
SPI:操作日志本地处理
/
public interface IOperationLogGetService {
/*
- 自定义日志监听
- @param logDTO 日志传输实体
*/
boolean createLog(LogDTO logDTO) throws Exception;}
这个我改下,文档没更新
from log-record.
获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip
图里的只是使用的示例,并不是实际我的代码。
你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。
你网上搜类似的文章很多的:
https://www.cnblogs.com/ying-dong/p/12329085.html我的意思其实是拦截到request对象,传递日志处理那一级进行统一处理,主要是想利用框架带来的便利
其实比较灵活,举例几种方式:
第一种方式:在你能拿到Request的地方,直接用例如LogRecordContext.putVariable("ip", ip);
,放入框架的上下文,这样的好处是写入这个键值对后,在任何地方你都能拿到这个上下文,包括注解中的SpEL表达式里,也可以是在 你实现 IOperationLogGetService接口处理LogDTO的时候拿。坏处是这样会耦合业务代码中了,有一点耦合性。
第二种方式:在你IOperationLogGetService接口的实现里,通过上面说的从servlet里取或者从spring里面直接取到你要的request里的信息,比如IP地址等,拿到后直接写到logDTO的某个地方(由于IOperationLogGetService也是个spring托管的bean,所以你能正常使用spring的特性)。坏处是最好把消息处理的线程池关闭(log-record.thread-pool.enabled=false),改用主线程执行logDTO的处理,否则可能由于切换了线程,导致从servlet里取request或者一些其他方式取request会失效(因为请求进来的线程和我处理logDTO的线程已经不一样了,尽管我用了TransmittableThreadLocal,但不能保证所有父线程的上下文都集成到了子线程)这两种方式我感觉有时候并不是最佳实践,我感觉好的方式是在LogDTO增加request对象,方便用户进行个性化处理
request还是偏业务一点的概念,个人认为不太适合提升成一个LogDTO的属性。另外一个原因如果增加request字段,框架就必须帮用户完成request的获取,这点工作量就大了,无法覆盖完全,毕竟request的概念就很广。
from log-record.
#87 这是我的想法实现 这样就不用维护request对象了,而且用户也可以进行自定义操作
例如
1、实现接口IOperatorService ,对request对象操作(我们操作的时候request对象都是有效,只有异步写出会失效),放入logDTO.setExtra()字段,日志那一层进行具体封装自己的pojo,代码也就没有侵入性了
@Slf4j
@Service
public class IOperatorServiceImpl implements IOperatorService {
@Override
public void operatorServletRequestAttributes(ServletRequestAttributes servletRequestAttributes, LogDTO logDTO) {
HttpServletRequest request = servletRequestAttributes.getRequest();
Map<String, String[]> parameterMap = request.getParameterMap();
String contextPath = request.getContextPath();
String method = request.getMethod();
JSONObject map = new JSONObject();
map.put("parameterMap", parameterMap);
map.put("contextPath",contextPath);
map.put("method",method);
logDTO.setExtra(JSON.toJSONString(map));
}
}
from log-record.
获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip
图里的只是使用的示例,并不是实际我的代码。
你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。
你网上搜类似的文章很多的:
https://www.cnblogs.com/ying-dong/p/12329085.html我的意思其实是拦截到request对象,传递日志处理那一级进行统一处理,主要是想利用框架带来的便利
其实比较灵活,举例几种方式:
第一种方式:在你能拿到Request的地方,直接用例如
LogRecordContext.putVariable("ip", ip);
,放入框架的上下文,这样的好处是写入这个键值对后,在任何地方你都能拿到这个上下文,包括注解中的SpEL表达式里,也可以是在 你实现 IOperationLogGetService接口处理LogDTO的时候拿。坏处是这样会耦合业务代码中了,有一点耦合性。第二种方式:在你IOperationLogGetService接口的实现里,通过上面说的从servlet里取或者从spring里面直接取到你要的request里的信息,比如IP地址等,拿到后直接写到logDTO的某个地方(由于IOperationLogGetService也是个spring托管的bean,所以你能正常使用spring的特性)。坏处是最好把消息处理的线程池关闭(log-record.thread-pool.enabled=false),改用主线程执行logDTO的处理,否则可能由于切换了线程,导致从servlet里取request或者一些其他方式取request会失效(因为请求进来的线程和我处理logDTO的线程已经不一样了,尽管我用了TransmittableThreadLocal,但不能保证所有父线程的上下文都集成到了子线程)
目前还是只有这两种方式吗?
from log-record.
Related Issues (20)
- 传入自定义线程池 HOT 1
- @OperationLog的success参数建议 HOT 1
- 你的mac地址怎么获取的 HOT 1
- 使用mybatisplus动态表名插件和aop有冲突 HOT 1
- 支持一下作者,开源不易,我也做日志库的,作者可以帮我宣传一下吗?
- 自定义 log-record.diff-msg-format 结果错误 HOT 3
- 关于 @LogRecordDiffObject 和 @LogRecordDiffField 的一些建议 HOT 3
- 关于自定义 success、exception 和全局异常处理的顺序问题 HOT 1
- 新增常用公共函数和可序列化对象注解的建议 HOT 1
- @OperationLog嵌套线程上下文被清除
- Java17启动报错,改为jdk1.8就没问题 HOT 3
- 请问可以自动获取controller层的request参数吗
- Null return value from advice does not match primitive return type for: public abstract boolean cn.monitor4all.logRecord.service.IOperationLogGetService.createLog(cn.monitor4all.logRecord.bean.LogDTO) HOT 1
- 最新版本的拉不下来 log-record-core包没有上传 HOT 1
- springboot3 无法通过 maven 下载jar 包 HOT 4
- 自定义上下文空字符串影响多个@OperationLog的定义顺序 HOT 1
- 文档中描写有问题 HOT 1
- 编码文件格式问题 HOT 2
- _DIFF()时getDeclaredFields()获取不到父类字段问题 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from log-record.