Java 记录器:无法在 logger.properties 文件中设置日志级别
Java Logger: Can't set log level in logger.properties file
我有一个 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);
}
}
只是猜测。来自文档:
All properties whose names end with ".level" are assumed to define log levels for Loggers. Thus "foo.level" defines a log level for the logger called "foo" and (recursively) for any of its children in the naming hierarchy. Log Levels are applied in the order they are defined in the properties file. Thus level settings for child nodes in the tree should come after settings for their parents.
先尝试设置 .level
,然后再定义任何处理程序。如果您先设置根日志级别,您之后定义的日志将继承根日志级别。
另外:
A property "config". This property is intended to allow arbitrary configuration code to be run.
java.util.logging.config.file
是一个系统 属性,在配置文件中不起作用。尝试只使用 "config".
我有一个 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);
}
}
只是猜测。来自文档:
All properties whose names end with ".level" are assumed to define log levels for Loggers. Thus "foo.level" defines a log level for the logger called "foo" and (recursively) for any of its children in the naming hierarchy. Log Levels are applied in the order they are defined in the properties file. Thus level settings for child nodes in the tree should come after settings for their parents.
先尝试设置 .level
,然后再定义任何处理程序。如果您先设置根日志级别,您之后定义的日志将继承根日志级别。
另外:
A property "config". This property is intended to allow arbitrary configuration code to be run.
java.util.logging.config.file
是一个系统 属性,在配置文件中不起作用。尝试只使用 "config".