在 log4j 中,每个类别都需要一个记录器对象,而不是每个对象。由于通常您的控制器、服务、daos 等通常是单例的,因此在每个中包括一个记录器对象作为实例变量是可以的。你会写类似的东西
public void MyServiceImpl implements MyService {
private Logger logger = Logger.getLogger(getClass());
....
}
如果您有一堆控制器都需要自己的记录器(服务和 daos 也是如此),您甚至可以将该 Logger 声明放在抽象基础控制器中(服务和 daos 也是如此)。它可以是受保护的字段,也可以是带有 getter 的私有字段,但由于日志记录类别很重要,因此您需要为每个控制器(子)类创建一个记录器。
当然,有太多的记录器是一个有效的问题,所以如果你的类不是单例的,你需要做点别的。如果您要向域对象添加日志记录,并为此创建了数十个或数百个域对象,您不希望为每个域对象创建一个记录器对象。在这种情况下,我使用(并且看到其他人使用)记录器作为类变量,例如:
public void MyDomainObject {
private static Logger logger = Logger.getLogger(MyDomainObject.class);
....
}
就记录“架构”而言,让它遵循您的应用程序架构。如果您在应用程序架构中很好地分离了关注点,并且对所有内容进行了适当的分层,并且为您的类和接口选择了好的名称,那么您的日志记录结构应该遵循。