Java Logger:无法在logger.properties文件中设置日志级别

时间:2016-09-14 23:44:53

标签: java logging java.util.logging

我有一个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"

以下是我遇到的问题:

  1. java.util.logging.SimpleFormatter.format正在运作。当我在这里更改格式时,我会在项目中立即看到更改。所以我知道至少我正在正确导入文件。
  2. .level无效。我已尝试将其更改为infofinestwarning等,但在我更改之后,即使我告诉它不显示,我仍会看到所有的INFO消息INFO。
  3. java.util.logging.config.file无效。我有点期望这个不起作用,因为它是一个相对的路径。有人知道如何解析属性文件中的相对路径名吗?
  4. 解决方案

    我需要将.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);
        }
    }
    

1 个答案:

答案 0 :(得分:3)

只是一个猜测。来自文档:

  

假定名称以“.level”结尾的所有属性都定义Loggers的日志级别。因此,“foo.level”为命名层次结构中的任何子项定义了一个名为“foo”和(递归)的记录器的日志级别。 日志级别按属性文件中定义的顺序应用。因此,树中子节点的级别设置应该在其父级的设置之后进行。

在定义任何处理程序之前,请先尝试设置.level。如果先设置根记录器级别,则之后定义的记录器将继承根日志级别。

此外:

  

属性“config”。此属性旨在允许运行任意配置代码。

java.util.logging.config.file是系统属性,在配置文件中不起作用。尝试使用“config”。