当创建一个日志记录器时,如何避免重复自己?
当创建一个日志记录器时,如何避免重复自己?
我认为创建java.util.logging.Logger
实例的常见习语是:
public class SomeClassName { private static final Logger LOG = Logger.getLogger(SomeClassName.class.getName()); }
当我重构代码(例如更改类名)时,我的IDE会管理更改该行的适当方式。但是,我仍然觉得必须重复类名很麻烦。我真正想做的就是像Logger.getLogger(getName())
或Logger.getLogger(class.getName())
这样做,但在静态初始化中这不是合法的Java。
有没有更好的方法可以获取记录器而不涉及重复自己?
admin 更改状态以发布 2023年5月24日
Java专家新闻通讯第137期解决了这个问题。它建议应用一个记录器工厂,可以通过生成异常并分析调用堆栈来检测实际的类名,例如。
我个人认为这比原始问题更糟糕,但这只是我的2分钱。无论如何,从技术上讲,它是有趣的,所以在这里是:
public class LoggerFactory { public static Logger make() { Throwable t = new Throwable(); StackTraceElement directCaller = t.getStackTrace()[1]; return Logger.getLogger(directCaller.getClassName()); } } ... public class BetterApplication { private final static Logger logger = LoggerFactory.make(); ... }