我正在使用带有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
......这很有效,所以我很确定我的罐子还可以。
有谁知道这里发生了什么?我已经尝试过我能想到的每一种组合。
谢谢, 阿拉斯泰尔
答案 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。