首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LoggerFactory.getLogger(this.getClass().getName()) ( LoggerFactory.getLogger(ClassName.class) )

LoggerFactory.getLogger(this.getClass().getName()) ( LoggerFactory.getLogger(ClassName.class) )
EN

Stack Overflow用户
提问于 2015-11-18 11:41:17
回答 7查看 80.9K关注 0票数 32

我正在努力提高我在Java中的优化技能。为了实现这一目标,我制定了一个旧的程序,我正在尽我最大的努力使它变得更好。在这个程序中,我使用SL4J进行日志记录。为了得到我做过的记录器:

代码语言:javascript
复制
private static final Logger logger = LoggerFactory.getLogger(this.getClass().getName());

在编写代码时,我认为这是最好的选择,因为我删除了对类名的引用(这可能是重构的)。但现在我不太确定了..。

代码语言:javascript
复制
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);

另一方面,保留对类名的引用,但它移除一个方法调用。对于一个类来说,这可能不是一个很大的性能改进,但是当您有很多类时,这可能是个问题。

所以我的问题是:

哪种方法更好?使用类名还是让它通过反射?

请用正反两面来激励你的答案。谢谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-11-18 11:55:26

我将在这里分享我的观点。我想说的是,从性能的角度来看,这是你不应该被打扰的情况。在代码中,可能有一些部分可以进行比以下内容更多的优化:)

现在关于你的问题。看看洛格工厂代码

注意,getLogger(Class<?> name)只是调用重载的方法:

代码语言:javascript
复制
Logger logger = getLogger(clazz.getName());

做一些额外的计算。因此,带有字符串的方法显然要稍微快一些。

通常,模式是将Logger引用维护为类中的静态字段,如下所示:

代码语言:javascript
复制
public class SomeClass {
   private static final Logger LOG =   LoggerFactory.getLogger(SomeClass.class);
}

在本例中,您不能真正使用this.getClass(),因为this实际上并不存在(您在静态上下文中运行)。

根据我的经验,最好使用ClassName.getClass()作为参数,除非您真的希望使用来自不同类的同一个记录器。在这种情况下,您最好使用一些表示记录器的逻辑常量。

例如,假设您试图使用3个不同的类来访问数据库。因此,您创建记录器'DB',分配一个将写入database.log的文件附录,并且您希望在这3个不同的类中重用相同的记录器。

因此,您应该使用以下代码:

代码语言:javascript
复制
public class SomeClass {
   private static final Logger LOG =   LoggerFactory.getLogger("DB");
}

希望这能有所帮助

票数 17
EN

Stack Overflow用户

发布于 2018-08-17 09:49:42

迟到了!

因为我很可能会在未来寻找这个。

有一种方法可以创建复制/粘贴友好的Logger实例(当然,这几乎不是做某事的好理由!)使用Java 7的MethodHandles类。

代码语言:javascript
复制
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
票数 20
EN

Stack Overflow用户

发布于 2015-11-18 11:48:47

我通常做的是

代码语言:javascript
复制
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);

然而,这个成语

代码语言:javascript
复制
protected final Logger log = LoggerFactory.getLogger(getClass());

同样常见。在这个问题上您可以找到更多关于这些约定的信息。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33779127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档