如何减少每个 class 中的 Logger.getLogger(...) 样板文件
How to reduce Logger.getLogger(...) boilerplate in every class
要将记录器与 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();
}
但是为每个 class 文件添加这个总是让我有些不安:
Logger l = Logger.getLogger("MyLog");
我该如何重构这个重复项?
Is there a better recommended way for logging, which could be less intrusive/less repeative but offers the same or even better functions?
您可以将 l
设为 class 的 private static
或 private
字段,但除此之外没有明显的改进。
(有一些不好的想法,比如 public static
"global" 变量,或者 "universal" 基础 class 中的 private static
声明。但是那些是坏主意......不是更好的方法。)
但是,嘿,声明本地记录器对象的一行代码很难"intrusive" ...是吗?
在每个 class 文件中登录是正确的方法,尽管它看起来有点冗余。
日志记录的重要功能是记录异常。如果我们想直接找到异常发生的地方,我们应该知道class名称和方法名称。
但是您可能会在捕获异常时忘记记录。
我们正在使用反射场和静态场,这 API:http://commons.forgerock.org/bom/apidocs/org/forgerock/i18n/slf4j/LocalizedLogger.html#getLoggerForThisClass()
您可以使用项目 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");
}
}
要将记录器与 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();
}
但是为每个 class 文件添加这个总是让我有些不安:
Logger l = Logger.getLogger("MyLog");
我该如何重构这个重复项?
Is there a better recommended way for logging, which could be less intrusive/less repeative but offers the same or even better functions?
您可以将 l
设为 class 的 private static
或 private
字段,但除此之外没有明显的改进。
(有一些不好的想法,比如 public static
"global" 变量,或者 "universal" 基础 class 中的 private static
声明。但是那些是坏主意......不是更好的方法。)
但是,嘿,声明本地记录器对象的一行代码很难"intrusive" ...是吗?
在每个 class 文件中登录是正确的方法,尽管它看起来有点冗余。
日志记录的重要功能是记录异常。如果我们想直接找到异常发生的地方,我们应该知道class名称和方法名称。
但是您可能会在捕获异常时忘记记录。
我们正在使用反射场和静态场,这 API:http://commons.forgerock.org/bom/apidocs/org/forgerock/i18n/slf4j/LocalizedLogger.html#getLoggerForThisClass()
您可以使用项目 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");
}
}