【发布时间】:2016-04-28 15:06:17
【问题描述】:
我有三门课。
- BaseLogger - 我们在这里创建 Logger 的静态实例。
- BaseClass - 框架级类包含几乎在每个类中都使用的通用方法。
- SomeClass - 它实现 BaseClass 并记录一些信息。
BaseLogger
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
public class BaseLogger {
public final static Logger LOG = LogManager.getLogger(BaseLogger.class);
}
基类
public class BaseClass extends BaseLogger{
//Some common methods used throughout Application.
}
SomeClass
public class SomeClass extends BaseClass{
public static void main(String[] args){
LOG.info("Test Log");
}
}
输出
2016-04-28 16:52:11 INFO BaseLogger:7 - Test Log
必需:有人可以指导我如何实现以下目标。
2016-04-28 16:52:11 INFO SomeClass:5 - Test Log
由于我使用了静态,所以我不允许在 LogManager.getLogger 中使用 this,我必须使用 BaseLogger 类名有人可以指导我如何打印当前类如果从其他类调用 LOG,则使用名称而不是 BaseLagger。
【问题讨论】:
-
不要那样做。所有日志框架都设计为通过为每个类制作一个静态 Logger 来使用。此外,用所有“常用方法”制作一个“大师”类是一种严重的反模式;使其成为一个不需要任何继承的单独类,并将其方法公开。继承不是共享功能的正确方式。
-
谢谢你的好建议。如果我们不使用继承并将 Logger 设为公共静态会怎样。它仍然会提供相同的输出而不是必需的输出。
-
为每个类创建一个 Logger 并创建每个
private static final。您希望每个 Logger 的名称与使用它来记录消息的类匹配,因此日志条目清楚地表明它们的来源。这样做的成本可以忽略不计。即使您有 1,000 个类,1,000 个 Logger 对象在您的应用程序的占用空间中也几乎不会被注意到。