我有一个java项目,我使用maven来构建。
我在我的项目中使用 java.util.logging.Logger
,并希望使用logger.properties
文件(而不是命令行)进行配置。
我创建了一个 logger.properties
文件:
handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level=WARNING
java.util.logging.SimpleFormatter.format=[%4$s] %5$s %n
java.util.logging.config.file="../../results/api.log"
以下是我遇到的问题:
java.util.logging.SimpleFormatter.format
正在运作。当我在这里更改格式时,我会在项目中立即看到更改。所以我知道至少我正在正确导入文件。.level
无效。我已尝试将其更改为info
,finest
,warning
等,但在我更改之后,即使我告诉它不显示,我仍会看到所有的INFO消息INFO。java.util.logging.config.file
无效。我有点期望这个不起作用,因为它是一个相对的路径。有人知道如何解析属性文件中的相对路径名吗?我需要将.level
移到顶部,如下所示:
logger.properties
.level=WARNING
handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
java.util.logging.SimpleFormatter.format=[%4$s] %5$s %n
然后,为了将结果保存到" api.log",我在我的代码中这样做了:
RequestHelper.java
import org.apache.commons.io.FilenameUtils;
public class RequestHelper {
private static final Logger LOGGER = Logger.getLogger( RequestHelper.class.getName() );
protected RequestHelper() {
//SET LOGGER TO OUTPUT TO "../../results/api.log"
//Logs will ALSO output to console.
String result_file = getNormalizedAbsolutePath("../../results/api.log");
Handler fh = new FileHandler(result_file);
Logger.getLogger("").addHandler(fh);
}
public static String getNormalizedAbsolutePath(String fileName) {
String path;
File file = new File(fileName);
try {
path = file.getCanonicalPath();
} catch (IOException e) {
LOGGER.warning("Error while computing the canonical path of file: " + fileName);
path = file.getAbsolutePath();
}
return FilenameUtils.normalize(path);
}
}
答案 0 :(得分:3)
只是一个猜测。来自文档:
假定名称以“.level”结尾的所有属性都定义Loggers的日志级别。因此,“foo.level”为命名层次结构中的任何子项定义了一个名为“foo”和(递归)的记录器的日志级别。 日志级别按属性文件中定义的顺序应用。因此,树中子节点的级别设置应该在其父级的设置之后进行。
在定义任何处理程序之前,请先尝试设置.level
。如果先设置根记录器级别,则之后定义的记录器将继承根日志级别。
此外:
属性“config”。此属性旨在允许运行任意配置代码。
java.util.logging.config.file
是系统属性,在配置文件中不起作用。尝试使用“config”。