Tomcat6似乎没有加载我的LogFormatter类

las*_*ejl 4 java logging classloader tomcat6 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我把它打包成一个.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
Run Code Online (Sandbox Code Playgroud)

在尝试不同的包装,不同的配置后,我决定尝试内置的"org.apache.juli.OneLineFormatter" - 这完美地运作.所以配置应该没问题.

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

las*_*ejl 5

我找到了解决方案.

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

Bootstrap(/ jre/lib/ext) - >系统(/ catalina-home/bin /) - > Common(/ catalina-home/lib) - > Webapps.

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

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

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

-Djava.endorsed.dirs=${catalina_home}/endorsed
Run Code Online (Sandbox Code Playgroud)

此Endorsed目录将在System类加载之前运行.