如何在多个java项目中使用相同的记录器

时间:2014-05-09 16:29:30

标签: java logging netbeans

我正在寻找以下系统设置的解决方案。

我们有一个Java NetBeans项目,它使用所有实体和数据库层所需的功能来处理Oracle数据库(我们不能用hibernate替换它)。其他Java NetBeans项目使用此项目来读取和写入数据库。

我希望能够在DB项目中设置Logger(我们使用标准java.util.logging.Logger)来依赖于使用它的应用程序之一。这是必需的,以便我的所有日​​志记录都在一个文件中,阅读它是有意义的;在多个文件的日志分割中无法理解事件链。

我有一个简单的解决方案,我不喜欢,这是在我的db项目的每个类中注入记录器。这使得我的所有构造函数变得更加复杂,如果我要将它用于每个实体,我将需要修改大量代码(记录db层实际执行的操作很有用)。我想要一个解决方案,我将一个简单的参数传递给整个db项目,这样我所有常用的静态最终记录器都可以在正确的位置写入。

这是一个例子,只是为了澄清我想要的内容

在Db项目中:

public class Table{
  private final static Logger logger = Logger.XXXXXXX; <--the method I need to accomplish my goal
}

在应用程序项目

public class TableInteractor{
  private Table table;
  private static final Logger logger = Logger.getLogger("MyApplication");
}

我提到的解决方案需要这样的东西

public class Table{
  private final static Logger logger;
  public Table(Logger logger){
    this.logger = logger;
  }     
}

public class TableInteractor{
  private Table table;
  private static final Logger logger = Logger.getLogger("MyApplication");
  ...
  table = new Table(logger);
}

有没有办法将“MyApplication”传递给Db项目,以便其中的Logger以与应用程序中相同的方式实例化? 如果您需要有关我的设置的更多信息以便给我答案,我可以添加更多信息。

修改

我刚注意到记录器有一个名为setParent(Logger l)的方法 如果我在DB项目中创建一个记录器,我可以将应用程序记录器传递到DB层并将其设置为DB记录器的父记录吗?

作为替代方案,我考虑将应用程序记录器的文件处理程序传递到db logger并使用它,以便两个项目都使用相同的日志文件。

关于哪一个是最佳解决方案的任何建议?

1 个答案:

答案 0 :(得分:1)

常见模式是在调用工厂方法时使用类名为每个类使用一个记录器。这会创建记录器层次结构,您可以自定义记录器记录的级别以及用于处理日志记录的处理程序。当然,可以将更多记录器的输出发送到一个文件中。其中大部分内容当然都是用Java日志记录概述 - http://docs.oracle.com/javase/6/docs/technotes/guides/logging/overview.html

编写的