V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
autulin
V2EX  ›  Java

用户操作日志记录统计有什么比较好的方案么?

  •  
  •   autulin · 2017-10-12 15:46:34 +08:00 · 8101 次点击
    这是一个创建于 2623 天前的主题,其中的信息可能已经有所发展或是发生改变。
    主要问题就是记录方案和存储方案

    目前想的是用 AOP 给所有 Controller 一个切面,然后将日志写入到 MySQL 中,这样做比较方便统计。但是具体起来发现一个切面很难适应所有 Controller,因为每个 Controller 的参数可能不一样,但是每一个 Controller 都写一个方法又似乎太麻烦。另外 MySQL 到后期可能抗不住这么多日志,于是想另外一种存储就是把数据稍微格式化一下扔到 ElasticSearch 里面去,不过这样统计起来可能要复杂一些

    所以想请问现在记录和存储比较成熟的方案有哪些?
    10 条回复    2017-11-02 17:41:28 +08:00
    yidinghe
        1
    yidinghe  
       2017-10-12 15:53:52 +08:00
    ELK 是比较成熟的方案
    omygod
        2
    omygod  
       2017-10-12 16:50:02 +08:00
    controller 统一接收 post 请求,参数全部写在 requestbody 中,aop 拦截请求参数写入文件或消息队列,看情况写入 hadoop 或其他存储中落地保存,不知道这种方式行不行?
    xrlin
        3
    xrlin  
       2017-10-12 16:53:44 +08:00
    我也想知道有没有好的记录日志的方法, 如果还需要给用户查看操作记录, 用中间件之类的方式也感觉不太好使, 很难做到通用.
    autulin
        4
    autulin  
    OP
       2017-10-13 00:25:09 +08:00
    @yidinghe 之前也看了一下 ELK 的架构,初步感觉这个用于记录系统运行的日志还行,但是用来记录用户行为(访问接口、参数等)这种的结构化数据好像没有看到比较好的方案,比如可以在之后来统计某个用户访问某个接口多少次、访问时的参数是什么
    autulin
        5
    autulin  
    OP
       2017-10-13 00:28:16 +08:00
    @omygod 接口是 Restful 的已经定了,就不好改了。当然也可以从 request 里面稍微自己解析一下之后按照您的方法来存储,但是存到 Hadoop 之后再解析的话,感觉这个工程量还是有点大
    blueorange
        6
    blueorange  
       2017-10-13 10:48:07 +08:00
    我们之前同事是每个业务里面写一次,贼麻烦。
    autulin
        7
    autulin  
    OP
       2017-10-13 10:53:19 +08:00
    @blueorange #8 是啊,我现在暂时的方法是这样。另外问一下你们是存储到哪的?
    upupxjg
        8
    upupxjg  
       2017-10-13 18:04:00 +08:00
    ELK 本身是没有问题的,而问题在于收集的元数据格式不统一,这是当时定接口时候的坑,感觉也没啥好办法,必然要对各个 controller 的日志进行转换,不过可以想办法从应用中拿出来,统一到一个 ETL 过程中,尽量做逻辑复用和拼接吧
    autulin
        9
    autulin  
    OP
       2017-10-14 11:22:43 +08:00 via Android
    @upupxjg 还真是难有一招必杀的方法啊
    aboutyang
        10
    aboutyang  
       2017-11-02 17:41:28 +08:00
    我的处理方式:
    1. 通过这个 Filter 把用户标识、请求 IP 等信息 放在线程变量中;
    2. 新建一个 LogOperator 的 annotation, 里面可以增加一些字段 表示办理的业务;
    3. 使用 aop 拦截这个 annotation, 构造 OperaotrEvent 对象; OperatorEvent 中可以记录用户标识、请求 IP 等信息,同时把拦截方法的入参、返回 和 异常 都转换成 JSON 存储在 OperatorEvent 当中;
    4. 异步发布这个事件,通过事件监听处理数据;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5474 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.