RFR 8026499: Root Logger level can be reset unexpectedly
Daniel Fuchs
daniel.fuchs at oracle.com
Wed Oct 16 09:47:46 UTC 2013
Hi Mandy,
On 10/16/13 12:58 AM, Mandy Chung wrote:
>
> On 10/15/2013 9:48 AM, Daniel Fuchs wrote:
>> Hi,
>>
>> Please find below a fix for:
>>
>> 8026499: Root Logger level can be reset unexpectedly
>> https://bugs.openjdk.java.net/browse/JDK-8026499
>>
>> <http://cr.openjdk.java.net/~dfuchs/webrev_8026499/webrev.00/>
>>
>> The issue here is that calling a method like e.g. URL.openConnection()
>> will trigger the initialization of some platform logger, which could
>> in turn cause the root logger to be lazilly added to the system context,
>> which in turn causes the root logger's level to be reset with the
>> value found in the configuration file (INFO).
>>
>> The fix is to not reinitialize the value of the logger's level if
>> it already has been initialized.
>
> The change looks okay. When the root logger is added to the system
> context, it considers it as a newly created logger and thus resetting
> its level. The global logger should have the same issue as there is
> only a single instance. I believe the logger's handler doesn't get
> reset and level is the only issue.
That was my analysis too :-)
>
> Logger.hasLocalLevel() doesn't seem to be necessary and it seems to be
> more explicit to replace !logger.hasLocalLevel() with
> logger.getLevel() == null
I considered that but rejected it because getLevel() can be overridden,
and what I really want to know is whether setLevel() has been called.
The alternative would have been to declare a package
'setLevelIfAbsent()' method (but it would need to be invoked
in doPrivileged) or to add a package getLevelObject() method,
(which looked weird) or to expose levelObject - which I didn't want
to do.
Hence the hasLocalLevel() which I don't like very much but like better
than the alternatives ;-)
> It would also help to add a comment to explain the check.
Right.
// Do not reset the logger level if it has already been initialized
> TestRootLoggerLevel.java - it may be good to also test the global logger.
Good point.
> line 70: I believe this line is not necessary (do you mean to do any
> other checking and that's why you call LoggingSupport.getLogger?)
In fact either line 70-71 or line 73-74 are enough to trigger the issue.
What really triggers the issue however is the underlying call to
LogManager.demandSystemLogger(). I just put both for good measure ;-)
> I think the comment on the behavior before the fix (line 77-78) can be
> removed and this may become not as relevant after this bug fix. Line 104
> - this permission may be needed in your early version of this test? can
> be removed now? btw - should this test also run with no security manager?
Yes and yes.
Thanks for the review!
>
> Mandy
>
>
More information about the core-libs-dev
mailing list