如何在每个类中减少Logger.getLogger(...)样板

时间:2016-07-04 02:47:50

标签: java logging refactoring code-duplication

要使用带有Java的记录器,现在我使用这样的代码:

Logger logger = Logger.getLogger("MyLog");
FileHandler fh;

try {

  // This block configure the logger with handler and formatter
  fh = new FileHandler("c:\\MyLogFile.log", true);
  logger.addHandler(fh);
  logger.setLevel(Level.ALL);
  SimpleFormatter formatter = new SimpleFormatter();
  fh.setFormatter(formatter);

  // the following statement is used to log any messages   
  logger.log(Level.WARNING,"My first log");

} catch (SecurityException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

但它总是让我感到不安的是为每个类文件添加这个:

Logger l = Logger.getLogger("MyLog");

我怎么能重构这个重复?

4 个答案:

答案 0 :(得分:1)

  

是否有更好的推荐日志记录方式,这可能会减少干扰/减少重复但提供相同甚至更好的功能?

您可以l成为该课程的private staticprivate字段,但除此之外没有明显改善。

(在“通用”基类中有一些不好的想法,比如public static“全局”变量或private static声明。但这些都是不好的方法......不是更好的方法。 )

但是,嘿,声明你的本地记录器对象的一行代码几乎不是“侵入性”......是吗?

答案 1 :(得分:0)

登录每个类文件是正确的方法,相反它看起来有点冗余。

日志记录的重要功能是记录异常。如果我们想直接找到异常发生的位置,我们应该知道类名和方法名。

但是当你遇到异常时,你可能会忘记记录。

答案 2 :(得分:0)

答案 3 :(得分:0)

您可以使用lombok项目来做到这一点:

project lombok is here

以下是他们的网页上的示例(如果无法使用的话)。为了清楚起见,它仍然会在您生成的字节码中生成语句,但是它会停止bolierplate,现在您将得到一个较小的语句,但其中包含用于课程的内容,但是我目前正在研究的项目团队对此很满意。

import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;

@Log
public class LogExample {

  public static void main(String... args) {
    log.error("Something's wrong here");
  }
}

@Slf4j
public class LogExampleOther {

  public static void main(String... args) {
    log.error("Something else is wrong here");
  }
}

@CommonsLog(topic="CounterLog")
public class LogExampleCategory {

  public static void main(String... args) {
    log.error("Calling the 'CounterLog' with a message");
  }
}
Vanilla Java
 public class LogExample {
  private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());

  public static void main(String... args) {
    log.error("Something's wrong here");
  }
}

public class LogExampleOther {
  private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);

  public static void main(String... args) {
    log.error("Something else is wrong here");
  }
}

public class LogExampleCategory {
  private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog("CounterLog");

  public static void main(String... args) {
    log.error("Calling the 'CounterLog' with a message");
  }
}