453 } |
453 } |
454 return result; |
454 return result; |
455 } |
455 } |
456 |
456 |
457 Logger demandSystemLogger(String name, String resourceBundleName) { |
457 Logger demandSystemLogger(String name, String resourceBundleName) { |
458 return systemContext.demandLogger(name, resourceBundleName); |
458 // Add a system logger in the system context's namespace |
|
459 final Logger sysLogger = systemContext.demandLogger(name, resourceBundleName); |
|
460 |
|
461 // Add the system logger to the LogManager's namespace if not exist |
|
462 // so that there is only one single logger of the given name. |
|
463 // System loggers are visible to applications unless a logger of |
|
464 // the same name has been added. |
|
465 Logger logger; |
|
466 do { |
|
467 // First attempt to call addLogger instead of getLogger |
|
468 // This would avoid potential bug in custom LogManager.getLogger |
|
469 // implementation that adds a logger if does not exist |
|
470 if (addLogger(sysLogger)) { |
|
471 // successfully added the new system logger |
|
472 logger = sysLogger; |
|
473 } else { |
|
474 logger = getLogger(name); |
|
475 } |
|
476 } while (logger == null); |
|
477 |
|
478 // LogManager will set the sysLogger's handlers via LogManager.addLogger method. |
|
479 if (logger != sysLogger && sysLogger.getHandlers().length == 0) { |
|
480 // if logger already exists but handlers not set |
|
481 final Logger l = logger; |
|
482 AccessController.doPrivileged(new PrivilegedAction<Void>() { |
|
483 public Void run() { |
|
484 for (Handler hdl : l.getHandlers()) { |
|
485 sysLogger.addHandler(hdl); |
|
486 } |
|
487 return null; |
|
488 } |
|
489 }); |
|
490 } |
|
491 return sysLogger; |
459 } |
492 } |
460 |
493 |
461 // LoggerContext maintains the logger namespace per context. |
494 // LoggerContext maintains the logger namespace per context. |
462 // The default LogManager implementation has one system context and user |
495 // The default LogManager implementation has one system context and user |
463 // context. The system context is used to maintain the namespace for |
496 // context. The system context is used to maintain the namespace for |
660 // before we can refetch it. If it has been GC'ed then |
693 // before we can refetch it. If it has been GC'ed then |
661 // we'll just loop around and try again. |
694 // we'll just loop around and try again. |
662 result = findLogger(name); |
695 result = findLogger(name); |
663 } |
696 } |
664 } while (result == null); |
697 } while (result == null); |
665 } |
|
666 // Add the system logger to the LogManager's namespace if not exists |
|
667 // The LogManager will set its handlers via the LogManager.addLogger method. |
|
668 if (!manager.addLogger(result) && result.getHandlers().length == 0) { |
|
669 // if logger already exists but handlers not set |
|
670 final Logger l = manager.getLogger(name); |
|
671 final Logger logger = result; |
|
672 AccessController.doPrivileged(new PrivilegedAction<Void>() { |
|
673 public Void run() { |
|
674 for (Handler hdl : l.getHandlers()) { |
|
675 logger.addHandler(hdl); |
|
676 } |
|
677 return null; |
|
678 } |
|
679 }); |
|
680 } |
698 } |
681 return result; |
699 return result; |
682 } |
700 } |
683 } |
701 } |
684 |
702 |