Git Product home page Git Product logo

Comments (11)

sdhzwc avatar sdhzwc commented on August 13, 2024

有没有相关实现demo参考一下

from log-record.

qqxx6661 avatar qqxx6661 commented on August 13, 2024

获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip

图里的只是使用的示例,并不是实际我的代码。

你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。

你网上搜类似的文章很多的:

https://www.cnblogs.com/ying-dong/p/12329085.html

from log-record.

sdhzwc avatar sdhzwc commented on August 13, 2024

获取请求ip地址或者request对象,您是怎么传递的 我看图片当中也提到了访问ip

图里的只是使用的示例,并不是实际我的代码。

你要获取ip或者request对象,我理解你用常规的HttpServletRequest或者其他Spring或者web容器的就可以了,和操作日志框架本身没关系。

你网上搜类似的文章很多的:

https://www.cnblogs.com/ying-dong/p/12329085.html

我的意思其实是拦截到request对象,传递日志处理那一级进行统一处理,主要是想利用框架带来的便利

from log-record.

qqxx6661 avatar qqxx6661 commented on August 13, 2024

获取请求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.

qqxx6661 avatar qqxx6661 commented on August 13, 2024
@Component
public class CustomFuncTestOperationLogGetService implements IOperationLogGetService {
    @Override
    public void createLog(LogDTO logDTO) {
        log.info("logDTO: [{}]", JSON.toJSONString(logDTO));
        // 处理logDTO的地方,你可以在这里统一写入request信息到logDTO的特定字段里,写入哪个字段就看你需求了
    }
}

from log-record.

sdhzwc avatar sdhzwc commented on August 13, 2024

获取请求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.

sdhzwc avatar sdhzwc commented on August 13, 2024
@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.

qqxx6661 avatar qqxx6661 commented on August 13, 2024
@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.

qqxx6661 avatar qqxx6661 commented on August 13, 2024

获取请求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.

sdhzwc avatar sdhzwc commented on August 13, 2024

#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.

zpdlut avatar zpdlut commented on August 13, 2024

获取请求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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.