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

15

这与另一个问题类似,尽管我已经将logging.properties放在可执行的jar文件中,但仍然不起作用。

我有一个类(ReportGenerator),其中包含以下内容:

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

我正在使用Netbeans,所以我将logging.properties文件放在路径src/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生成的,解压后我可以看到logging.properties在jar包的主文件夹中。还有一个名为com的文件夹,里面有我的类。

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

当我从控制台运行时:

java - jar MyReportsJar.jar
通过控制台向我显示日志。我想将其记录到我在 logging.properties 中设置的文件中。
我做错了什么? 如何在不设置JVM java.util.logging.config.file参数的情况下完成它?
1个回答

19

在对抗这个问题并阅读了很多互联网资源后,我想出了这个解决方案:

我需要改变程序中LogManager的日志属性。我可以像这样使用.jar中打包的logging.properties文件:

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

然后我可以像之前一样获取记录器并记录:

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

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

但我发现可以在运行时指定另一个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文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接