我希望有一个配置文件,其中包含有关特定类应记录的log / where / what logger的信息。
示例:
class Foo
package myApp;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
class Foo {
static final Logger logger = Logger.getLogger(Foo.class.getName());
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\path\\to\\myApp.log.properties");
LogManager.getLogManager(). readConfiguration(fis);
logger.log(Level.INFO, "Msg message");
Bar obj = new Bar();
obj.doSth();
}
课程栏
package myApp;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Bar {
static final Logger logger = Logger.getLogger(Bar.class.getName());
public Bar() {
}
public void doSth() {
logger.log(Level.WARNING, "Msg message");
}
}
文件myApp.log.properties
handlers =
config =
myApp.Foo.handlers = java.util.logging.ConsoleHandler
myApp.Foo.useParentHandlers = false
myApp.Foo.level = INFO
myApp.Bar.handlers = java.util.logging.ConsoleHandler
myApp.Bar.useParentHandlers = false
myApp.Bar.level = INFO
输出:
Jul 23, 2014 1:27:12 PM myApp.Bar doSth
WARNING: Msg message
正如您所看到的,Foo的日志记录丢失了,我猜它是因为logger是静态的,并且是在加载和设置LogManager的配置之前创建的。
您能否建议为Foo记录器打印日志记录的解决方案?还有一个静态记录器和没有在程序执行时使用命令行参数-D configFile
?
答案 0 :(得分:1)
在您的示例中,调用LogingToFile.doSth
而不是Bar.doSth
。修改您的配置文件以包括:
myApp.LogingToFile.handlers = java.util.logging.ConsoleHandler
myApp.LogingToFile.useParentHandlers = false
myApp.LogingToFile.level = INFO
或者将new Bar().doSth();
添加到您的主要方法。
通过LogManager
源代码读取,只有在设置配置后创建记录器时才会加载Handlers
。这是错误JDK-8033661
readConfiguration does not cleanly reinitialize the logging system。列出的解决方法是:
- 不要在日志配置文件中使用per-logger处理程序
- 不要调用readConfiguration()或readConfiguration(InputStream),而是将配置存储在文件中并在JVM启动时加载
- 通过API调用配置日志记录
考虑到您的约束,解决方法是在创建记录器之前加载配置。
class Foo {
static {
try (FileInputStream fis = new FileInputStream("C:\\path\\to\\myApp.log.properties")) {
LogManager.getLogManager().readConfiguration(fis);
} catch (IOException ex) {
throw new ExceptionInInitializerError(ex);
}
}
static final Logger logger = Logger.getLogger(Foo.class.getName());
public static void main(String[] args) throws IOException {
logger.log(Level.INFO, "Msg message");
Bar obj = new Bar();
obj.doSth();
}
}