Java API 设计中的面向对象事件记录

Object Oriented Event Logging in Java API Design

我想解决这个问题:

大多数应用程序都有一些日志记录服务,用于将应用程序中的事件报告给商业智能分析数据库。此外,像 android 这样的移动应用程序会报告相同的内容,例如用户行为等。有很多图书馆可以做到这一点。

问题:当开发人员想要在他们的代码中添加日志记录时,通常是通过散布代码行来报告他们方法中的某些内容,例如:

      void doStuff() {
         try {
             doTheThing():
             logger.info("the thing was done", someClientInfoDTO, timestamp, eventid);
            } catch(Throwable woops) {
                logger.error(woops);
            }

           }

我到处都能看到这种模式以一种或另一种形式出现。我想采用面向对象的方法来记录日志,因此 类 可以用它们的日志记录行为进行注释。消除了开发人员仅在他们认为重要的事情足以记录正在发生的地方粘贴日志代码行的需要。

我的想法是像这样重写上面的代码:

@Logger("class level logger")
class StuffDoer {
    @Logger("what to log", whatToDoOnError, etc)
    void doStuff() {
                doTheThing():
                   }
}

问题:是否有解决该问题的库或现有项目。有没有人有成功做到这一点的例子?我不想重新发明轮子,但我一直在挖掘,结果一无所获。根据对这个问题的回答,我可能会启动一个 github 项目来做到这一点。

Jake Wharton 让我们与 timber 分道扬镳:https://github.com/JakeWharton/timber 这是注入日志框架的好方法,但仍然会导致开发人员在代码中调用它。

面向方面编程正是您所需要的。

方面是一种常见特征,通常分散在方法、类、对象层次结构甚至整个对象模型中。它是看起来和闻起来应该具有结构的行为,但是您无法使用传统的面向对象技术找到一种在代码中表达这种结构的方法。

方面通常用于日志记录缓存验证监控.

Here is a basic description as well as some libraries like AspectJ