而不是在每个类上指定类名:
log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);
可以使用:
log = Logger.getLogger(this.getClass());
会有什么影响?
答案 0 :(得分:19)
如果创建子类,日志消息将记录到子类的记录器中。
package pkgone;
public class SuperType {
private Logger log = Logger.getLogger(this.getClass());
public void someAction() {
log.info("Doing something");
}
}
package pkgtwo;
import pkgone.SuperType;
public class SubType extends SuperType {
// for instances of SubType, the log object in SuperType
// will get initialized with SubType's class object
}
// some code somewhere that uses SubType
SubType obj = new SubType();
obj.someAction();
在上面的示例中,“执行某些操作”将记录到pkgtwo.SubType记录器而不是pkgone.SuperType记录器,这可能是您想要的,也可能不是。
答案 1 :(得分:10)
尝试这种方式查找通用类......
private static final Log LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());
最好的部分是静态使用此方法。
答案 2 :(得分:6)
如果您不想重复制作logger
并希望避免写错错的班级名称,那么@Log就会Project Lombok。
如果您不介意在项目中再使用一个库,则只需添加一个带有简单注释的记录器即可。
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");
}
}
答案 3 :(得分:2)
当然看起来很好。
请注意,一个含义是,如果您在静态上下文中使用日志时可能会遇到问题 - 它可能未初始化或可能不可见
答案 4 :(得分:1)
+1,记录器将是子类。
此外,如果您将此作为类的日志记录模板应用,如果您的类是抽象的 - 您的this.getClass将失败,因为您没有此类的实例。
答案 5 :(得分:1)
使用Apache commons的日志工厂:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
public class SomeNewClass {
...
private final Log logger = LogFactory.getLog(this.getClass());
...
}
不必做任何其他事情。在问题发布时不确定LogFactory是否可用。 如果您不想使用LogFactory,您也可以简单地使用带有getClass()的private final。
private final Logger log = Logger.getLogger(this.getClass());
没有理由创建子类,除非您想要记录日志记录,这也可以通过操作日志配置文件来完成(log4j.xml,如果你正在使用它)。当记录器定义为静态时,您不能使用this.getClass()。如果没有静态或私人的最终结果,您可以让记录器对您不想要的危险可能的更改保持开放。
答案 6 :(得分:1)
公共最终课程AppLogger {
const path = require("path")
const merge = require("webpack-merge")
const HtmlWebpackPlugin = require("html-webpack-plugin")
exports.onCreateWebpackConfig = ({ actions, getConfig, stage }) => {
if ( stage.endsWith('-html') ) {
return
}
let modifiedConfig = getConfig()
modifiedConfig = merge(modifiedConfig, {
entry: {
frame: path.resolve("./src/frame.js"),
},
plugins: [
new HtmlWebpackPlugin({
title: "Component Preview",
chunks: ["frame"],
filename: "frame.html",
}),
],
})
actions.replaceWebpackConfig(modifiedConfig)
}
}
创建此类,然后将其添加到您的调用类中。
private AppLogger() {
}
public static final void logInfo(Class<?> clazz, String logMessage) {
Logger logger = Logger.getLogger(clazz);
if (logger.isInfoEnabled()) {
logger.info(logMessage);
}
}
public static final void logInfo(Class<?> clazz, String logMessage, Throwable th) {
Logger logger = Logger.getLogger(clazz);
if (logger.isInfoEnabled()) {
logger.info(logMessage, th);
}
}
答案 7 :(得分:-1)
据我所知,没有任何影响。根据马特评论,我猜,这是每个人都想要的正确行为。