在尝试为 Tomcat 添加自定义处理程序时(使用
java.util.logging
),我找不到添加自定义属性的方法。
例如如何设置处理程序的
abc
属性的值?
# logging.properties
handlers = java.util.logging.ConsoleHandler, com.company.tomcat.JdbcHandler
.handlers = java.util.logging.ConsoleHandler, com.company.tomcat.JdbcHandler
com.company.tomcat.JdbcHandler.level = FINE
com.company.tomcat.JdbcHandler.abc=hello
package com.company.tomcat;
public class JdbcHandler extends Handler {
private String abc;
public void setAbc(String abc) {
this.abc = abc; // this is not set
}
@Override
public void publish(LogRecord record) {
System.out.println("record " + record); // this is called
}
...
}
对于 JDK 和 Tomcat,自定义处理程序必须在创建时与 LogManager 交互以读取解析和加载的值。您必须设置 java.util.logging.Handler 类定义的所有属性以及新属性。
这是一个帮助您入门的示例:
import java.util.logging.LogManager; //Use the JUL LogManager
public class JdbcHandler extends Handler {
private String abc;
public JdbcHandler() {
final LogManager m = LogManager.getLogManager();
final String p = getClass().getName(); //property prefix
String lvl = m.getProperty(p + ".level"); //parse and set the level
try {
super.setLevel(lvl == null ? Level.ALL : Level.parse(lvl));
} catch(RuntimeException failed) {
this.reportError("Unable to set level", failed, ErrorManager.OPEN_FAILURE);
super.setLevel(Level.ALL);
}
//TODO set other handler properties for formatter, filter, encoding, and errorManager.
//set your property for JDK, Tomcat, etc.
initAbc(m.getProperty(p + ".abc"));
}
//WildFly will support this way of assigning the property.
public void setAbc(String abc) {
initAbc(abc);
}
private void initAbc(String abc) {
this.abc = abc;
}
@Override
public void publish(LogRecord record) {
if (!isLoggable(record) {
return;
}
System.out.println("record " + record); // this is called
}
...
}
值得保留公共
setAbc
方法,因为 WildFly 将使用该方法来分配属性。