log4j.Logger中getLogger的通用方式

时间:2012-05-23 18:01:25

标签: java log4j

而不是在每个类上指定类名:

log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);

可以使用:

log = Logger.getLogger(this.getClass());

会有什么影响?

8 个答案:

答案 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)

对于调用super方法的子类实例,

+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)

据我所知,没有任何影响。根据马特评论,我猜,这是每个人都想要的正确行为。