我是否需要在所有类中都有一个Logger的静态实例来实现log4j?

时间:2014-05-26 05:59:10

标签: java logging log4j

Log4j与我的应用程序完美配合,但我的问题就是那里 任何其他有效的方法来实现它而不是在我的应用程序的所有类中都有以下“logger”实例?

public Class myClassName{
    private static Logger logger = Logger.getLogger("myClassName");

    public String myMethod(){
        try{
              ....
        }catch (Exception e) {
             logger.error("Location:MyMethod:" + e.getMessage());
             return "failed";
        }
    }
}

4 个答案:

答案 0 :(得分:2)

您可以为所有类使用一个Logger,并且您的日志消息不再显示您的哪个类称为记录器,因为所有类都使用具有单个名称的相同记录器。 Logger.getLogger("myClassName")用于将记录器的名称设置为类名,以便通过获取记录器名称将类名轻松添加到日志消息中。

这也可以,但不推荐:

public Class MyLogger{
    public static Logger logger = Logger.getLogger("myLoggerName");
}

-

public Class myClassName{
    public String myMethod(){
        try{
              //....
        }catch (Exception e) {
             MyLogger.logger.error("Location:MyMethod:" + e.getMessage());
             return "failed";
        }
    } 
}

我认为您可以通过反射添加类名(即使您只使用一个记录器),但这将非常慢,并且也不建议高效使用。

答案 1 :(得分:1)

您需要在类中拥有记录器的静态实例。

最好添加final修饰符,因为它将在所有实例中保持不变。这是一个很好的编程实践。

private static final Logger LOGGER = Logger.getLogger(ZPAction.class.getName());

答案 2 :(得分:1)

正如TheLostMind建议的那样,您可以使用如下代码:

public class Logging {
    private static Logging instance;
    private static final Logger logger = Logger.getLogger("Logging");

    private Logging(){
    }

    public static synchronized Logging getInstance()
    {
        if (instance == null)
            instance = new Logging();

        return instance;
    }

    public static Logger getLogger() {
        return logger;
    }


}

答案 3 :(得分:0)

要记录消息,您需要有一个日志实例。因此需要以下一行。

private static final Logger logger = Logger.getLogger("myClassName");

或者,您可以使用某种面向方面编程。

以下链接提供了使用Spring AOP的示例 http://www.fiveminutes.eu/logging-with-spring-aop/