Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何减少每个类中的Logger.getLogger(…)样板文件_Java_Logging_Refactoring_Code Duplication - Fatal编程技术网

Java 如何减少每个类中的Logger.getLogger(…)样板文件

Java 如何减少每个类中的Logger.getLogger(…)样板文件,java,logging,refactoring,code-duplication,Java,Logging,Refactoring,Code Duplication,要将logger与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.setL

要将logger与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");
我怎样才能重构出这种重复

是否有更好的日志记录推荐方法,可以减少干扰/减少重复,但提供相同或更好的功能

您可以将
l
设置为类的
private static
private
字段,但除此之外,没有显著的改进

(有一些坏主意,比如
公共静态
“全局”变量,或者在“通用”基类中的
私有静态
声明。但这些都是坏主意……不是更好的方法。)


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

登录每个类文件是一种正确的方法,尽管看起来有点冗余

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


但当捕获异常时,您可能会忘记记录日志

我们正在使用反射和静态字段,这个API:

您可以使用project lombok来实现这一点:

以下是他们的网页中的示例,如果它不可用。更清楚的是,它仍然会在生成的字节码中生成语句,但它会停止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");
  }
}

谢谢你的主意。但我确实希望尽可能少地涉及LIB。我一直相信最简单的就是最好的。如果我能避免log4j,我会尽量避免它……我不是建议你使用这个库。相反,你应该看看它是如何完成的,看看你是否喜欢这种方法,也许可以复制它。不是每个人都这样做。见下文。