无法为可执行 jar 配置日志记录

2022-09-03 14:08:13

这类似于另一个问题,尽管我已经将 放在可执行jar中并且不起作用。logging.properties

我有一个类(ReportGenerator),它具有以下各项:

 Logger logger = Logger.getLogger(ReportGenerator.class.getName());
 logger.log(Level.INFO, "LOG THIS");  

我正在使用Netbeans,所以我将文件放在路径中。它有这个(除其他外):logging.propertiessrc/main/resources

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = /my/folder/reports.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = OFF
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
com.mypackage.ReportGenerator.level = ALL

jar是使用Maven生成的,当解压缩时,我可以看到它在jar的主文件夹中。以及我的班级所在的文件夹。logging.propertiescom

-com
  -mypackage
      -ReportGenerator
logging.properties
...other things

当我从控制台运行时:

java - jar MyReportsJar.jar

它通过控制台向我显示日志。我想将其记录到我在logging.properties.

我做错了什么?如何在不设置JVM参数的情况下执行此操作?java.util.logging.config.file


答案 1

在处理了几天并阅读了互联网上的许多资源之后,我想出了这个解决方案:

我必须更改程序中LogManager的日志记录属性。我可以使用打包在这样的文件中:logging.properties.jar

LogManager.getLogManager().readConfiguration(ReportGenerator.class.getClassLoader().getResourceAsStream("logging.properties"));

然后我可以像以前一样做同样的事情来获取记录器和日志:

 Logger logger = Logger.getLogger(ReportGenerator.class.getName());
 logger.log(Level.INFO, "LOG THIS"); 

但是我发现非常有用,你可以在运行时指定另一个文件,所以我的最终代码是这样的:logging.properties

        String logFile = System.getProperty("java.util.logging.config.file");
        if(logFile == null){
            LogManager.getLogManager().readConfiguration(ReportGenerator.class.getClassLoader().getResourceAsStream("logging.properties"));
        }                
        Logger logger = Logger.getLogger(ReportGenerator.class.getName());
        logger.log(Level.INFO, "LOG THIS"); 

这样,如果我像这样执行jar:

java -jar MyReportsJar.jar

它使用内部文件。logging.properties

但是如果我执行:

java -Djava.util.logging.config.file=<external-logging.properties> -jar MyReportsJar.jar

它使用外部文件。logging.properties


答案 2

推荐