SLF4J,每次都要避免编写LoggerFactory.getLogger(MyClassName.class)

时间:2012-11-30 08:52:50

标签: java log4j slf4j

我正在用Java编写Web应用程序并使用SLF4J进行日志记录。

我已经厌倦了为每个使用日志记录的类编写以下行:

private static final Logger logger = LoggerFactory.getLogger(ThisClassName.class);

为避免冗余代码,我想的是

interface Loggable {
    Logger logger();
}

并且每个类都可以实现此接口,然后像AOP这样的魔术会插入LoggerFactory部分。

有没有人实现过这个或知道如何实现这个目标?

谢谢!

4 个答案:

答案 0 :(得分:12)

你正在使用eclipse吗?如果是这样,为什么不使用带有关键字的代码模板,如“logger”和以下模板:

${:import(org.slf4j.LoggerFactory, org.slf4j.Logger)}
private final static Logger LOGGER = LoggerFactory.getLogger(${enclosing_type}.class);

这样你就可以输入“logger”,点击 shift + space 就可以了。

答案 1 :(得分:2)

您使用的是CDI吗?如果是这样,创建一个生成器方法,然后@将该记录器注入任何启用CDI的类。

@Produces Logger createLogger(InjectionPoint injectionPoint) { 
    return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
}

请参阅http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1662

答案 2 :(得分:0)

Here中很好地演示了使用AOP进行记录。 似乎没有办法在一个方法中动态插入记录器来记录方法执行的细节。单元测试用例可以解决这个问题。 AOP

可以记录方法调用的记录

答案 3 :(得分:0)

如果您在课程上使用@ Slf4j注释,则默认情况下,lombok会生成一个变量“ log”

@Slf4j
public class YourClass {
    public void someMethod() {
        log.error("Test log");
    }
}

查看链接 https://github.com/mplushnikov/lombok-intellij-plugin/issues/154#issuecomment-163940867