Jetty6 slf4j logging - 如何让自定义日志Formatter工作?

时间:2010-10-21 16:40:36

标签: logging jetty slf4j

我正在使用带有SLF4J和java日志记录的jetty6并且一直在尝试添加自定义日志格式化程序,但无论我尝试什么,我似乎无法让它工作。

我有一个Formatter,像这样:

package mycode.logging;
public class DeadSimpleFormatter extends SimpleFormatter
{
  // Nothing here at all - just an empty subclass of SimpleFormatter.
}

我想将此作为我的码头日志记录的默认值,因此我创建了一个$ {jetty.home} /resources/logging.properties文件:

handlers=java.util.logging.FileHandler
.level=INFO
java.util.logging.FileHandler.pattern=logs/test_%u.%g.log
java.util.logging.FileHandler.limit=90000
java.util.logging.FileHandler.count=20
java.util.logging.FileHandler.formatter=mycode.logging.DeadSimpleFormatter

mycode.level=INFO

我创建了一个包含DeadSimpleFormatter类的jar文件logging.jar。我将这个jar放入$ {jetty.home} / lib / ext。

我开始码头:

java -Djava.util.logging.config.file=resources/logging.properties 
    -jar start.jar etc/jetty-logging.xml etc/jetty.xml

我可以看到正在创建的输出文件。它遵循我的属性文件中定义的限制和计数规则。但它不使用我的格式化程序 - 它恢复为默认的XmlFormatter。我没有看到stdout或stderr的任何错误。

如果我更改logging.properties文件以设置格式化程序如下:

java.util.logging.FileHandlerformatter=java.util.logging.SimpleFormatter

...然后它工作 - 使用普通的SimpleFormatter写出日志文件。所以我相信我的房产还可以,我的slfj罐子等等都是正确的。这只是Jetty不喜欢我的DeadSimpleFormatter。

因为什么都没有 - 字面上! - 在DeadSimpleFormatter中,我认为这可能是一个类加载问题。我试着显式添加这样的jar文件:

java -Djetty.class.path=/mypathtojettyhome/lib/ext/logging.jar
    -Djava.util.logging.config.file=resources/logging.properties -jar start.jar 
    etc/jetty-logging.xml etc/jetty.xml

......但没有快乐。

我将一个main方法放入我的DeadSimpleFormatter并检查我是否可以运行jar:

java -jar lib/ext/logging.jar 

......这很有效,所以我很确定我的罐子还可以。

有谁知道这里发生了什么?我已经尝试过我能想到的每一种组合。

谢谢, 阿拉斯泰尔

2 个答案:

答案 0 :(得分:0)

要使自定义格式化程序在配置中工作,它应该是公共的并且具有公共无参数的构造函数。由于java.util.logging.LogManager尝试通过反射机制初始化此格式化程序,如果失败则使用默认值。

答案 1 :(得分:0)

Alastair,不确定你是否有这个工作,但我相信我遇到了和你一样的问题,而且我的工作正常。您可以看到我的问题和答案here,但其主旨是:

在将lib或lib / ext文件夹添加到类路径并加载自定义类之前,会加载java日志记录。为了让它工作,我必须做的是使用相同的包名创建我的自定义类,它是start.jar中的主要路径(例如org.mortbay.start),然后将编译后的.class文件添加到该路径中start.jar直接在我的logging.properties中设置为使用org.mortbay.start.MyCustomFormatter。