我需要执行包装器接口,以便您可以在不更改代码的情况下在不同类型的日志记录机制之间切换。所以我在Wrapper类中有自己的info(String message)方法,比如:
public void info(对象消息) { if(isInfoEnabled()) { logger.info(message); } }
它按预期工作,除了在记录时它不显示我正在记录的类的行和行,而是来自Wrapper类的类和行。 你能帮忙吗......
答案 0 :(得分:3)
我的建议是使用Simple Logging Facade for Java (SLF4J)而不是您自己的包装器。从其网站:
Java或(SLF4J)的简单日志外观用作各种日志框架的简单外观或抽象,例如: java.util.logging,log4j和logback,允许最终用户在部署时插入所需的日志记录框架。
这是Jakarta Commons Logging(JCL)的现代和首选 1 替代方案。我建议阅读this article进行详细分析,但简短版本是SLF4J不会遇到类加载器问题或JCL观察到的内存泄漏。 Commons Logging的作者自己admits it。
如果你想知道,SLF4J是由CekiGülcü编写的,它是Log4J的作者(现在可以使用Logback,Log4J的继承者)。所以这家伙知道一两件关于伐木的事情,并且有一些机会“他的”包装好于我的。
换句话说,恕我直言,在2010年创建一个好的好的包装器时,没有任何意义。
1 请不要使用Spring作为反例,Spring是一个糟糕的反例(见SPR-5327)。
答案 1 :(得分:1)
已经存在围绕各种日志记录实现的包装器接口:Apache Commons Logging。您是否尝试过使用它?
答案 2 :(得分:1)
所以,为了解决我的具体要求,这就是应该做的......
public class Log4jWrapper implements ILogger
{ 私人记录器记录器;
/**
* The name of this wrapper class
*/
static final String FQCN = Log4jWrapper.class.getName();
/**
* Constructor which returns the root content
*/
public Log4jWrapper()
{
logger = Logger.getRootLogger();
}
/**
* Creates a {@link Logger} object
*
* @param clazz name reference for this category to create
*/
public Log4jWrapper( Class<?> clazz )
{
logger = Logger.getLogger( clazz );
}
/**
* Log an debug message
*
* @param msg the message
*/
public void debug( Object msg )
{
if ( isDebugEnabled() )
{
logger.log( FQCN, Level.DEBUG, msg, null );
}
}
答案 3 :(得分:1)
这是你如何包装log4j。您传递log()
包装类的名称。
class YourLog4jWrapper {
Logger _base = Logger.getLogger(/*....*/);
private void log(Object msg) {
_base.log(YourLog4jWrapper.class.getName(), Priority.INFO, msg, null);
}
}