slf4j logger单例问题

时间:2013-05-02 05:28:51

标签: java log4j singleton slf4j

我想使用slf4j进行记录。我写自己的记录器类

public class GlobalLogger {
   private static final Logger logger = LoggerFactory.getLogger(GlobalLogger.class);
   public static void logApplicationLog(String message) {
     logger.info("[" + APPLICATION_LOG + "]" + message);
   }
}

我在log4j中使用模式布局,以便在日志%C中将类显示为GlobalLogger,但我希望%C显示调用类。如何在整个应用程序中记录器的对象应该是单例的情况下这样做呢?

2 个答案:

答案 0 :(得分:0)

在logger类上写一个包装器,它将作为单例类。喜欢:

public class Logger{

private static Logger logger;    
private Logger(){
}
public synchronized static Logger getLogger()
    {
        if (logger!= null)
            return logger;
        return logger=LoggerFactory.getLogger(GlobalLogger.class);
    }

}

答案 1 :(得分:0)

如果您想要一个简写来创建记录器并向其发送消息:

public class GlobalLogger {

   public static void logApplicationLog( String message, Class source ) {
     LoggerFactory.getLogger(source).info("[" + APPLICATION_LOG + "]" + message);
   }

}

我不知道是否有可能在“每条消息”的基础上注入一个来源,尽管可能有一个。

注意:我建议在每个应该记录内容的类中使用静态Logger实例而不是上面给出的代码。您甚至可以更改IDE的模板以创建新的clases,以便为您包含该模板。

修改

我看到你想放一个静态部分来创建“类别”(就你上面的评论而言)。

那你为什么不LoggerFactory.getLogger(APPLICATION_LOG)为每个类别创建appender并在模式中添加静态文本?或者您必须能够按包更改logLevels吗?