logging.properties文件的存在会阻止日志被写入

elcex8rz  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(309)

我有一个springbootweb应用程序,需要在slf4j后面使用javautil日志记录。当我不创建 logging.properties 文件,控制台记录器工作正常,所有信息和以上消息都被记录。当我创建一个 logging.properties 文件,只记录致命错误。不管发生什么事 logging.properties 文件包含-我尝试了很多不同的配置-它只记录致命错误时,这个文件存在。
这是我导入的jar(使用gradle)

implementation("org.slf4j:slf4j-api")
    implementation("org.slf4j:slf4j-jdk14")

我还必须确保没有导入logback classic,因为我的一个依赖项正在尝试将其拉入。

configurations.all {
    exclude(group = "ch.qos.logback", module = "logback-classic")
}

那么,这是我的 logging.properties 文件。它位于 src/main/resources/logging.properties .

handlers = java.util.logging.ConsoleHandler
.level= ALL
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

这不是我尝试使用的唯一配置。
有人能看出我做错了什么吗?为什么它只记录致命错误?

yvt65v4c

yvt65v4c1#

你的 java.util.logging.config.file 系统属性指向可读文件?

import java.util.logging.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;

public class Test {

    public static void main(String[] args) throws IOException {
        String file = System.getProperty("java.util.logging.config.file");
        if (file == null) {
            System.out.println("Configuration was not specified");
            return;
        }

        System.out.println(file);
        System.out.println(new File(file).getCanonicalPath());
        System.out.println(Files.isReadable(Paths.get(file)));
        System.out.println(Arrays.toString(Logger.getLogger("").getHandlers()));
    }
}

如果我运行这个指向不存在的文件的测试程序,我会得到以下结果:

/home/jmehrens/logging.properties
/home/jmehrens/logging.properties
false
[]

这个 false 在输出中,我在配置中指定的文件是不可读的(因为该位置不存在)。根记录器处理程序为空,因为日志管理器无法读取my logging.properties。
从终端可以看到文件不存在于该路径:

[jmehrens@localhost ~]$ pwd
/home/jmehrens
[jmehrens@localhost ~]$ ls logging.properties
ls: cannot access logging.properties: No such file or directory

在相关答案中,您可以遵循其他调试提示。
您的脚本告诉我“未指定配置”。在使用gradle构建springboot应用程序的上下文中,我在哪里指定它?
我可以在spring引导配置文件中定义系统属性吗?介绍如何在SpringBoot中设置系统属性。如何通过gradle为我的测试提供系统属性,-d包括如何通过gradle传递属性。
如果这对您不起作用,那么您需要指定一个 PostConstruct 方法来定位日志配置文件并配置logmanager。

4ktjp1zp

4ktjp1zp2#

我刚从jul切换到log4j2,因为我更了解这个文档。

hl0ma9xz

hl0ma9xz3#

这适用于您现有的logging.properties文件。
我想问题是 java.util.logging 不查找属性资源,只查找文件(或默认资源)。
我无法解释为什么在存在logging.properties资源时看到不同的行为。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;

public class Example2 {
    public static void main(String... args) throws IOException {
        final InputStream inputStream = Example2.class.getResourceAsStream("/logging.properties");
        LogManager.getLogManager().readConfiguration(inputStream);
        Logger logger = LoggerFactory.getLogger(Example2.class);
        logger.debug("message 0");
        logger.info("message 1");
        logger.error("message 2");
    }
}

相关问题