“JUL 执行原理和流程”的版本间的差异
		
		
		
		
		
		跳到导航
		跳到搜索
		
				
		
		
	
Jihongchang(讨论 | 贡献)  (→日志原理解析)  | 
				Jihongchang(讨论 | 贡献)   (→调试跟踪)  | 
				||
| 第17行: | 第17行: | ||
=== 调试跟踪 ===  | === 调试跟踪 ===  | ||
{| class="wikitable"  | {| class="wikitable"  | ||
| − | |  | + | | colspan="2" |class JULTest<syntaxhighlight lang="java">  | 
| − | + | Logger logger = Logger.getLogger("io.github.jihch");  | |
| + | </syntaxhighlight>  | ||
|-  | |-  | ||
| − | + | | colspan="2" |class java.util.logging.Logger<syntaxhighlight lang="java">  | |
| + |     @CallerSensitive  | ||
| + |     public static Logger getLogger(String name) {  | ||
| + |         return demandLogger(name, null, Reflection.getCallerClass());  | ||
| + |     }  | ||
| + | </syntaxhighlight>  | ||
|-  | |-  | ||
| − | + | | colspan="2" |class java.util.logging.Logger<syntaxhighlight lang="java">  | |
| − | !manager.demandLogger(name, resourceBundleName, caller);  | + |     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);  | ||
| + |     }  | ||
| + | </syntaxhighlight>  | ||
|-  | |-  | ||
| − | !manager.ensureLogManagerInitialized();  | + | |class java.util.logging.LogManager<syntaxhighlight lang="java">  | 
| − | + |     public static LogManager getLogManager() {  | |
| + |         if (manager != null) {  | ||
| + |             manager.ensureLogManagerInitialized();  | ||
| + |         }  | ||
| + |         return manager;  | ||
| + |     }  | ||
| + | </syntaxhighlight>  | ||
| + | |class java.util.logging.LogManager  | ||
|-  | |-  | ||
| − | + | |class java.util.logging.LogManager<syntaxhighlight lang="java">  | |
| − | owner.  | + |     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();  | ||
| − | owner.rootLogger = owner.new RootLogger();  | + |                         // 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);  | ||
| + |                         }  | ||
| − | owner.addLogger(  | + |                         @SuppressWarnings("deprecation")  | 
| + |                         final Logger global = Logger.global;  | ||
| + |                         owner.addLogger(global);  | ||
| + |                         return null;  | ||
| + |                     }  | ||
| + |                 });  | ||
| + |             } finally {  | ||
| + |                 initializationDone = true;  | ||
| + |             }  | ||
| + |         }  | ||
| + |     }  | ||
| + | </syntaxhighlight>  | ||
| + | !manager.demandLogger(name, resourceBundleName, caller);  | ||
| + | |-  | ||
| + | |  | ||
| + | !  | ||
| + | |-  | ||
| + | |  | ||
!  | !  | ||
|-  | |-  | ||
| − | + | |  | |
!  | !  | ||
|}  | |}  | ||
2023年2月23日 (四) 08:54的版本
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); | 
|---|---|
