我在Jetty 6上运行的Linux上有一个Solr服务器,我正在尝试为java日志记录设置自定义格式化程序,但我似乎无法识别我的自定义类。我是Java的新手,所以引用它可能是我如何导出我的类或类似的问题。请注意,这几乎与here中的问题相同,但是由于我确实有一个公共的无参数构造函数,所以答案没有用。
我的格式化工具如下所示(如here所述):
package myapp.solr;
import java.text.MessageFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class LogFormatter extends Formatter {
private static final MessageFormat fmt = new MessageFormat("{0,date,yyyy-MM-dd HH:mm:ss} {1} [{2}] {3}\n");
public LogFormatter() {
super();
}
@Override public String format(LogRecord record) {
Object[] args = new Object[5];
args[0] = new Date(record.getMillis());
args[1] = record.getLevel();
args[2] = record.getLoggerName() == null ? "root" : record.getLoggerName();
args[3] = record.getMessage();
return fmt.format(args);
}
}
在我的logging.properties文件中,我接下来(以及配置文件路径/模式和旋转限制和计数的属性):
handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.formatter = myapp.solr.LogFormatter
然后我将我的类导出到myapp.jar并将其放在jetty.home的lib / ext文件夹中(我也尝试将它直接放在lib下,我尝试使用-Djetty.class.path指定它的路径)参数)。但是,当我运行我的solr应用程序时,它仍然使用XmlFormatter。我能够成功地将其更改为使用SimpleFormatter,而不是我自己的自定义格式化程序。
我还创建了一个测试类,它导入我的LogFormatter,创建一个实例变量并调用format方法并将结果打印到控制台,并且在Eclipse中没有任何问题。
如果有帮助,我用来启动Solr / Jetty的命令是:
nohup java -DSTOP.PORT=8079 -DSTOP.KEY=secret -Dsolr.solr.home=../solr_home/local -Djava.util.config.file=../solr_home/local/logging.properties -jar start.jar > /var/log/solr/stdout.log 2&>1 &
那么我做错了什么,为什么它不会使用我的自定义格式化程序?
答案 0 :(得分:1)
感谢一些有用的建议here。问题是在从lib或lib / ext文件夹加载自定义类之前设置了java日志记录,因此我需要将它添加到start.jar中。
我是如何做到这一点的,我创建了一个自己的新包,我调用了org.mortbay.start并将自定义的LogFormatter类添加到其中。 Eclipse自动从bin / org / mortbay / start文件夹中构建LogFormatter.class。然后我打开了start.jar归档并将我的自定义类添加到其中,因此我有start.jar / org / mortbay / start / LogFormatter.class。一旦那样,我就可以使用以下方式设置格式化程序:
handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.formatter = org.mortbay.start.LogFormatter