29 import java.util.*; |
29 import java.util.*; |
30 import java.util.concurrent.CopyOnWriteArrayList; |
30 import java.util.concurrent.CopyOnWriteArrayList; |
31 import java.security.*; |
31 import java.security.*; |
32 import java.lang.ref.WeakReference; |
32 import java.lang.ref.WeakReference; |
33 import java.util.function.Supplier; |
33 import java.util.function.Supplier; |
34 import java.util.logging.LogManager.LoggerContext; |
|
35 |
34 |
36 /** |
35 /** |
37 * A Logger object is used to log messages for a specific |
36 * A Logger object is used to log messages for a specific |
38 * system or application component. Loggers are normally named, |
37 * system or application component. Loggers are normally named, |
39 * using a hierarchical dot-separated namespace. Logger names |
38 * using a hierarchical dot-separated namespace. Logger names |
319 // (see 7054233), we need to determine if Logger.getLogger is to add |
318 // (see 7054233), we need to determine if Logger.getLogger is to add |
320 // a system logger or user logger. |
319 // a system logger or user logger. |
321 // |
320 // |
322 // As an interim solution, if the immediate caller whose caller loader is |
321 // As an interim solution, if the immediate caller whose caller loader is |
323 // null, we assume it's a system logger and add it to the system context. |
322 // null, we assume it's a system logger and add it to the system context. |
324 private static LoggerContext getLoggerContext() { |
323 // These system loggers only set the resource bundle to the given |
|
324 // resource bundle name (rather than the default system resource bundle). |
|
325 private static class SystemLoggerHelper { |
|
326 static boolean disableCallerCheck = getBooleanProperty("sun.util.logging.disableCallerCheck"); |
|
327 private static boolean getBooleanProperty(final String key) { |
|
328 String s = AccessController.doPrivileged(new PrivilegedAction<String>() { |
|
329 public String run() { |
|
330 return System.getProperty(key); |
|
331 } |
|
332 }); |
|
333 return Boolean.valueOf(s); |
|
334 } |
|
335 } |
|
336 |
|
337 private static Logger demandLogger(String name, String resourceBundleName) { |
325 LogManager manager = LogManager.getLogManager(); |
338 LogManager manager = LogManager.getLogManager(); |
326 SecurityManager sm = System.getSecurityManager(); |
339 SecurityManager sm = System.getSecurityManager(); |
327 if (sm != null) { |
340 if (sm != null && !SystemLoggerHelper.disableCallerCheck) { |
328 // 0: Reflection 1: Logger.getLoggerContext 2: Logger.getLogger 3: caller |
341 // 0: Reflection 1: Logger.demandLogger 2: Logger.getLogger 3: caller |
329 final int SKIP_FRAMES = 3; |
342 final int SKIP_FRAMES = 3; |
330 Class<?> caller = sun.reflect.Reflection.getCallerClass(SKIP_FRAMES); |
343 Class<?> caller = sun.reflect.Reflection.getCallerClass(SKIP_FRAMES); |
331 if (caller.getClassLoader() == null) { |
344 if (caller.getClassLoader() == null) { |
332 return manager.getSystemContext(); |
345 return manager.demandSystemLogger(name, resourceBundleName); |
333 } |
346 } |
334 } |
347 } |
335 return manager.getUserContext(); |
348 return manager.demandLogger(name, resourceBundleName); |
336 } |
349 } |
337 |
350 |
338 /** |
351 /** |
339 * Find or create a logger for a named subsystem. If a logger has |
352 * Find or create a logger for a named subsystem. If a logger has |
340 * already been created with the given name it is returned. Otherwise |
353 * already been created with the given name it is returned. Otherwise |
374 // getLogger("Foo"); |
387 // getLogger("Foo"); |
375 // |
388 // |
376 // would throw an IllegalArgumentException in the second call |
389 // would throw an IllegalArgumentException in the second call |
377 // because the wrapper would result in an attempt to replace |
390 // because the wrapper would result in an attempt to replace |
378 // the existing "resourceBundleForFoo" with null. |
391 // the existing "resourceBundleForFoo" with null. |
379 LoggerContext context = getLoggerContext(); |
392 return demandLogger(name, null); |
380 return context.demandLogger(name); |
|
381 } |
393 } |
382 |
394 |
383 /** |
395 /** |
384 * Find or create a logger for a named subsystem. If a logger has |
396 * Find or create a logger for a named subsystem. If a logger has |
385 * already been created with the given name it is returned. Otherwise |
397 * already been created with the given name it is returned. Otherwise |
422 */ |
434 */ |
423 |
435 |
424 // Synchronization is not required here. All synchronization for |
436 // Synchronization is not required here. All synchronization for |
425 // adding a new Logger object is handled by LogManager.addLogger(). |
437 // adding a new Logger object is handled by LogManager.addLogger(). |
426 public static Logger getLogger(String name, String resourceBundleName) { |
438 public static Logger getLogger(String name, String resourceBundleName) { |
427 LoggerContext context = getLoggerContext(); |
439 Logger result = demandLogger(name, resourceBundleName); |
428 Logger result = context.demandLogger(name, resourceBundleName); |
|
429 |
440 |
430 // MissingResourceException or IllegalArgumentException can be |
441 // MissingResourceException or IllegalArgumentException can be |
431 // thrown by setupResourceInfo(). |
442 // thrown by setupResourceInfo(). |
432 result.setupResourceInfo(resourceBundleName); |
443 result.setupResourceInfo(resourceBundleName); |
433 return result; |
444 return result; |
436 // package-private |
447 // package-private |
437 // Add a platform logger to the system context. |
448 // Add a platform logger to the system context. |
438 // i.e. caller of sun.util.logging.PlatformLogger.getLogger |
449 // i.e. caller of sun.util.logging.PlatformLogger.getLogger |
439 static Logger getPlatformLogger(String name) { |
450 static Logger getPlatformLogger(String name) { |
440 LogManager manager = LogManager.getLogManager(); |
451 LogManager manager = LogManager.getLogManager(); |
441 LoggerContext context = manager.getSystemContext(); |
|
442 |
452 |
443 // all loggers in the system context will default to |
453 // all loggers in the system context will default to |
444 // the system logger's resource bundle |
454 // the system logger's resource bundle |
445 Logger result = context.demandLogger(name); |
455 Logger result = manager.demandSystemLogger(name, SYSTEM_LOGGER_RB_NAME); |
446 return result; |
456 return result; |
447 } |
457 } |
448 |
458 |
449 /** |
459 /** |
450 * Create an anonymous Logger. The newly created Logger is not |
460 * Create an anonymous Logger. The newly created Logger is not |
1586 // the resource bundle is in a restricted package |
1596 // the resource bundle is in a restricted package |
1587 return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() { |
1597 return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() { |
1588 public ResourceBundle run() { |
1598 public ResourceBundle run() { |
1589 try { |
1599 try { |
1590 return ResourceBundle.getBundle(SYSTEM_LOGGER_RB_NAME, |
1600 return ResourceBundle.getBundle(SYSTEM_LOGGER_RB_NAME, |
1591 locale); |
1601 locale, |
|
1602 ClassLoader.getSystemClassLoader()); |
1592 } catch (MissingResourceException e) { |
1603 } catch (MissingResourceException e) { |
1593 throw new InternalError(e.toString()); |
1604 throw new InternalError(e.toString()); |
1594 } |
1605 } |
1595 } |
1606 } |
1596 }); |
1607 }); |