我想在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不加载我的类?
答案 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
此认可目录将在系统类加载之前运行。