Tomcat6似乎没有加载我的LogFormatter类

时间:2012-11-27 09:19:34

标签: java logging tomcat6 classloader java.util.logging

我想在Tomcat6中自定义日志消息,并创建了一个类“MyFormatter”,如下所示:

public class LogFormatter extends Formatter {

@Override
public String format(LogRecord record) {
    StringBuilder sb = new StringBuilder();

    sb.append("LOLCAT--")
            .append(new Date(record.getMillis()))
            .append(" \t")
            .append(record.getThreadID())
            .append(" \t")
            .append(record.getSourceMethodName())
            .append(" \t")
            .append(record.getSourceClassName())
            .append(" \t")
            .append(record.getLevel().getLocalizedName())
            .append(": ")
            .append(formatMessage(record))
            .append(System.getProperty("line.separator"));

    return sb.toString();
    }
}

我把它打包成.jar并放在$ {catalina.home} / lib。

在我的logging.properties文件中,我添加了以下内容:

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = lolcat.
1catalina.org.apache.juli.FileHandler.formatter = my.package.LogFormatter

尝试不同的包装,不同的配置后,我决定尝试内置的“org.apache.juli.OneLineFormatter” - 这完美无缺。所以配置应该没问题。

问题仍然存在,为什么Tomcat6不加载我的类?

1 个答案:

答案 0 :(得分:5)

我找到了解决方案。

在阅读了Tomcat和Class Loading之后,我发现Tomcat有一个订单。它是这样的;

Bootstrap(/ jre / lib / ext) - >系统(/ catalina-home / bin /) - > Common(/ catalina-home / lib) - > web应用。

包含日志记录的tomcat-juli.jar加载了“System”-step,所以当你将其他日志记录的东西放在一起时,它会忽略它,因为它已经被加载了。

然后解决方案是在tomcat-juli.jar加载之前放置.jar,也就是在/jre/lib/ext中加载。

编辑: 将它保存在jre文件夹中并不总是一个好主意,所以我发现最好的解决方案是将它放在一个认可的目录中。

-Djava.endorsed.dirs=${catalina_home}/endorsed

此认可目录将在系统类加载之前运行。