JUL 执行原理和流程
https://www.bilibili.com/video/BV1iJ411H74S?p=10
日志原理解析
- 初始化 LogManager
- Log Manager 加载 logging.properties 配置
- 添加 Logger 到 logManager
- 从单例 LogManager 获取 Logger
- 设置级别 Level,并指定日志记录 LogRecord
- Filter 提供了日志级别之外更细粒度的控制
- Handler 处理日志输出位置
- Formatter 用来格式化 LogRecord
调试跟踪
class JULTestLogger logger = Logger.getLogger("io.github.jihch");
| |
class java.util.logging.Logger @CallerSensitive
public static Logger getLogger(String name) {
return demandLogger(name, null, Reflection.getCallerClass());
}
| |
class java.util.logging.Logger private static Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
LogManager manager = LogManager.getLogManager();
SecurityManager sm = System.getSecurityManager();
if (sm != null && !SystemLoggerHelper.disableCallerCheck) {
if (caller.getClassLoader() == null) {
return manager.demandSystemLogger(name, resourceBundleName);
}
}
return manager.demandLogger(name, resourceBundleName, caller);
}
| |
class java.util.logging.LogManager public static LogManager getLogManager() {
if (manager != null) {
manager.ensureLogManagerInitialized();
}
return manager;
}
|
class java.util.logging.LogManager |
class java.util.logging.LogManager final void ensureLogManagerInitialized() {
final LogManager owner = this;
if (initializationDone || owner != manager) {
return;
}
synchronized(this) {
final boolean isRecursiveInitialization = (initializedCalled == true);
assert initializedCalled || !initializationDone
: "Initialization can't be done if initialized has not been called!";
if (isRecursiveInitialization || initializationDone) {
return;
}
initializedCalled = true;
try {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
assert rootLogger == null;
assert initializedCalled && !initializationDone;
// Read configuration.
owner.readPrimordialConfiguration();
// Create and retain Logger for the root of the namespace.
owner.rootLogger = owner.new RootLogger();
owner.addLogger(owner.rootLogger);
if (!owner.rootLogger.isLevelInitialized()) {
owner.rootLogger.setLevel(defaultLevel);
}
@SuppressWarnings("deprecation")
final Logger global = Logger.global;
owner.addLogger(global);
return null;
}
});
} finally {
initializationDone = true;
}
}
}
|
manager.demandLogger(name, resourceBundleName, caller); |
---|---|