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加载我的类?
我找到了解决方案.
在阅读了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类加载之前运行.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |