以编程方式获取Java日志文件的位置?

时间:2019-05-27 13:21:45

标签: java logging

我的应用程序在其中创建一个Java日志文件

$HOME/javaN.log

其中N是整数。有时,我的应用程序会运行几个实例,每个实例都会创建一个名为java1.logjava2.log等的日志文件。在执行过程中,我需要知道应用程序使用哪个日志文件。

是否可以通过编程方式确定日志文件的位置?

我在logging.properties文件中将记录器定义为com.xyz.foo。这是logging.properties的外观:

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = WARNING

com.xyz.foo.level = FINEST

java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.level=FINEST
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY:%1$tm:%1$td %1$tH:%1$tM:%1$tS[%4$s] %2$s%n%5$s%n%6$s%n
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

此行

java.util.logging.FileHandler.pattern = %h/java%u.log

将如上所述在用户的主文件夹中创建日志文件。

日志文件的创建和命名由Java框架在后台自动处理。如果另一个进程已经创建了日志文件,例如,如果java0.log存在,那么Logger将创建java1.log作为日志文件,它也会自动解决可能的命名冲突。

我知道如何显式设置日志文件,但是,我宁愿保持当前的日志记录机制,并获得Logger为日志文件选择的名称。

1 个答案:

答案 0 :(得分:0)

您可以提前创建一个HashMap {“ filename”:FileHandler},选择所需的名称并写入数据

public class TestLogging {

    private static Logger logger = Logger.getLogger(TestLogging.class.getName());


    public static void main(String[] args) throws IOException {

        HashMap<String, FileHandler> logMap = new HashMap<String, FileHandler>();

        logMap.put("a", new FileHandler("E:/work-java/wgx/ff//a.log"));
        logMap.put("b", new FileHandler("E:/work-java/wgx/ff//b.log"));


        aLog(logMap, "a");
//         aLog(logMap, "b");


    }

    private static void aLog(HashMap<String, FileHandler> logMap, String key) {
        logger.addHandler(logMap.get(key));
        logger.logp(Level.INFO, "TestLogging.class", "main", "logging");
    }
}
  • 但是记录器只能选择一个FileHandler

结果

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2019-05-27T21:49:34</date>
  <millis>1558964974608</millis>
  <sequence>0</sequence>
  <logger>com.huifer.TestLogging</logger>
  <level>INFO</level>
  <class>TestLogging.class</class>
  <method>main</method>
  <thread>1</thread>
  <message>logging</message>
</record>
</log>