Java 使用多个处理程序(包括自定义处理程序)记录日志级别
Java Logging Log levels with multiple handlers including custom handler
我已经使用属性文件实现了 Java 日志记录。
我在那里使用带有文件处理程序和自定义处理程序的自定义记录器。
我的问题是,自定义处理程序的日志级别不起作用。这是我的配置:
studium.logger.useParentHandlers = false
studium.logger.ProjectLogger.handlers = java.util.logging.FileHandler, studium.logger.WindowHandler
studium.logger.ProjectLogger.level = FINEST
studium.logger.WindowHandler.formatter = studium.logger.formatter.TextAreaFormatter
studium.logger.WindowHandler.level = INFO
java.util.logging.FileHandler.level = FINEST
java.util.logging.FileHandler.formatter = studium.logger.formatter.FileFormatter
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.pattern = log.txt
文件处理程序工作正常。它很好地记录在我的日志文件中。但是对于我的 WindowHandler,我仍然会得到日志级别为 Fine 的所有日志,而不仅仅是 Info 和 Warning
这是我的 WindowHandler:
public class WindowHandler extends StreamHandler {
private JTextArea textArea;
public WindowHandler() {
super();
this.textArea = MainFrame.out;
}
@Override
public void publish(LogRecord record) {
textArea.append(getFormatter().format(record));
}
public JTextArea getTextArea() {
return textArea;
}
public void setTextArea(JTextArea textArea) {
this.textArea = textArea;
}
}
这是我的 textArea 中的输出:
FINE Test log level FINE
WARNING Test log level WARNING
我错过了什么?
忽略 Swing threading issue present in your code, you have to call Handler.isLoggable(Record) 以便您的发布方法遵循您设置的日志级别。
public void publish(LogRecord record) {
if (isLoggable(record)) {
textArea.append(getFormatter().format(record));
}
}
修复线程问题和异常处理你应该得到类似的结果:
@Override
public void publish(LogRecord record) {
if (isLoggable(record)) {
try {
final String val = getFormatter().format(record);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
getArea().append(val);
} catch (RuntimeException e) {
reportError(val, e, ErrorManager.WRITE_FAILURE);
}
}
});
} catch (RuntimeException e) {
reportError(null, e, ErrorManager.WRITE_FAILURE);
}
}
}
private JTextArea getArea() {
if (!SwingUtilities.isEventDispatchThread()) {
throw new IllegalThreadStateException(Thread.currentThread().toString());
}
return null; //@todo Implement this.
}
我已经使用属性文件实现了 Java 日志记录。 我在那里使用带有文件处理程序和自定义处理程序的自定义记录器。 我的问题是,自定义处理程序的日志级别不起作用。这是我的配置:
studium.logger.useParentHandlers = false
studium.logger.ProjectLogger.handlers = java.util.logging.FileHandler, studium.logger.WindowHandler
studium.logger.ProjectLogger.level = FINEST
studium.logger.WindowHandler.formatter = studium.logger.formatter.TextAreaFormatter
studium.logger.WindowHandler.level = INFO
java.util.logging.FileHandler.level = FINEST
java.util.logging.FileHandler.formatter = studium.logger.formatter.FileFormatter
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.pattern = log.txt
文件处理程序工作正常。它很好地记录在我的日志文件中。但是对于我的 WindowHandler,我仍然会得到日志级别为 Fine 的所有日志,而不仅仅是 Info 和 Warning
这是我的 WindowHandler:
public class WindowHandler extends StreamHandler {
private JTextArea textArea;
public WindowHandler() {
super();
this.textArea = MainFrame.out;
}
@Override
public void publish(LogRecord record) {
textArea.append(getFormatter().format(record));
}
public JTextArea getTextArea() {
return textArea;
}
public void setTextArea(JTextArea textArea) {
this.textArea = textArea;
}
}
这是我的 textArea 中的输出:
FINE Test log level FINE
WARNING Test log level WARNING
我错过了什么?
忽略 Swing threading issue present in your code, you have to call Handler.isLoggable(Record) 以便您的发布方法遵循您设置的日志级别。
public void publish(LogRecord record) {
if (isLoggable(record)) {
textArea.append(getFormatter().format(record));
}
}
修复线程问题和异常处理你应该得到类似的结果:
@Override
public void publish(LogRecord record) {
if (isLoggable(record)) {
try {
final String val = getFormatter().format(record);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
getArea().append(val);
} catch (RuntimeException e) {
reportError(val, e, ErrorManager.WRITE_FAILURE);
}
}
});
} catch (RuntimeException e) {
reportError(null, e, ErrorManager.WRITE_FAILURE);
}
}
}
private JTextArea getArea() {
if (!SwingUtilities.isEventDispatchThread()) {
throw new IllegalThreadStateException(Thread.currentThread().toString());
}
return null; //@todo Implement this.
}