【问题标题】:Best Practice of Using org.apache.commons.logging.LogFactory.getLog使用 org.apache.commons.logging.LogFactory.getLog 的最佳实践
【发布时间】:2010-12-04 22:22:08
【问题描述】:

我可以知道使用 org.apache.commons.logging.LogFactory.getLog 的最佳做法是什么吗?

对我来说,我使用它的方式如下:

public class A
{
    private static final Log log = LogFactory.getLog(A.class);
}

public class B
{
    private static final Log log = LogFactory.getLog(B.class);
}

那么,如果我有 100 个类,就会创建 100 个静态日志对象?

还是这样最好?

public class A
{
    private static final Log log = LogFactory.getLog(Main.class);
}

public class B
{
    private static final Log log = LogFactory.getLog(Main.class);
}

所有 100 个类都引用同一个日志?

谢谢。

【问题讨论】:

    标签: java configuration logging


    【解决方案1】:

    第一个选项 - 每个类(或功能)都有一个记录器。由于大多数日志记录系统 - log4j、logback、java util logging 等都有记录器层次结构的概念,您可以将其与您的包层次结构相匹配,并更好地控制您希望在哪个级别记录哪些功能。例如:

    com.example=WARN       # global setting
    com.example.web=INFO   # increase logging for the web controllers
    com.example.dao=DEBUG  # trying to track bugs in the database layer
    

    【讨论】:

      【解决方案2】:

      在绝大多数情况下,你的路就是要走的路。

      主要优点是每个类都有一个记录器(或类别,或其他),可以单独配置,例如

      log4j.logger.org.springframework.transaction=DEBUG
      

      (假设 log4j)将为该类或包设置日志级别。如果您只使用一个记录器,则不能这样做。

      【讨论】:

        【解决方案3】:

        请记住大多数 java 开发人员忽略的“静态问题”,它也会影响 log4j、java.util.Logger 和 SLF4J。您可以在Apache Commons Wiki 中了解它。据报道,如果您正在开发一个库,计划将它发布在一个容器(例如 j2ee 容器)中,在许多应用程序之间共享,最好使用类似

        private transient final Log logger = LogFactory.getLog( this.getClass() );
        

        【讨论】:

        • 为什么不像下面这样:private transient final Log logger = LogFactory.getLog(ClassName.class);还是将类名作为字符串传递?
        猜你喜欢
        • 2012-12-31
        • 1970-01-01
        • 2017-11-29
        • 2010-10-08
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多