UL: logging before initialization?
David Holmes
david.holmes at oracle.com
Fri Mar 11 12:53:39 UTC 2016
On 11/03/2016 9:22 PM, Thomas Stüfe wrote:
> Hi David, Marcus,
>
> thanks for thinking about this! Please find my comments inline.
>
> On Fri, Mar 11, 2016 at 9:14 AM, Marcus Larsson
> <marcus.larsson at oracle.com <mailto:marcus.larsson at oracle.com>> wrote:
>
> Hi,
>
> On 2016-03-11 03:12, David Holmes wrote:
>
> Hi Thomas,
>
> Expanding to hotspot-dev as UL was not designed/built by the
> runtime team.
>
> My comments below based on my limited understanding of UL.
>
> On 11/03/2016 2:25 AM, Thomas Stüfe wrote:
>
> Hi all,
>
> I wanted to use UL to log some information from early OS
> initialization but
> found that we initialize logging quite late. It is
> initialized way after
> os::init() runs.
>
>
> There are various dependencies in the unified logging framework
> that prevent it (or at least parts of it) from being used early eg:
> - argument parsing and log configuration
> - existence of current thread (for logStreams)
>
>
> Currently, the framework can be used as soon as static
> initialization is done. This doesn't include the logStreams of
> course since they require resource allocations. The problem is as
> you say that there is no way to configure the logging before parsing
> the -Xlog command. This means up until that point the default
> configuration will apply, which means warnings and errors to stdout.
>
>
> I also see that warnings and errors are printed
> unconditionally even
> before, only log calls for levels <= info are quietly swallowed.
>
>
> Are those warnings/errors using UL? I suspect not.
>
>
> They could be, since errors and warnings are enabled by default.
>
>
> They are from UL. I see errors and warnings. Decorators seem to be off
> though, e.g. the timestamp, because they rely on initialization in
> os::init(). But nothing serious which breaks logging as long as one is
> fine with default settings.
>
>
>
>
> Silent swallowing is not good though.
>
> Would there be a way to move UL initialization and parsing
> of -Xlog
> Arguments to an earlier point to be able to use logging in
> os::init()?
>
>
> I don't see how you could utilize tags and levels until after
> full initialization of the logging system, so that would
> preclude using it as early as os::init.
>
>
> It is a possible solution I guess. I don't know how dependent
> argument parsing is on other initialization. There would always be
> some part of the initialization where you only have warning and
> error logging unless we do the parsing first thing during startup,
> which I assume will be impossible.
>
>
> Sure, the logging system must be fully initialized to use it. However, I
> argue that the logging system should be as independent as possible from
> the rest of the VM, so not rely on VM initialization. If that is the
> case - and I think it is now - then logging initialization and -Xlog
> parsing can be moved up in Thread::create_vm() to before os::init().
You would need to examine the complete transitive closure of logging
code to see if such a move is feasible.
> I would even argue that if this does not work, it is an error. For
> example, if we were to require Thread::current() to work for
> logging,e.g. for log decorators, this would mean logging breaks if
> Thread::current() is not available. So, if we make the logging system
> work for pre-initialization time, and add regression tests for this,
> this is a pretty good way to keep the logging system healthy and robust
> and avoid too much dependencies into the VM.
>
> I would think that the logging system as it is now is already robust -
> the fact that it works, with default settings, right after static
> initialization is a good sign. So, we could probably move initialization
> and -Xlog parsing to an earlier point with not much work.
While the logging system has taken a number of steps to make itself
immune to some initialization issues (for example "locking" uses a
semaphore and doesn't rely on Thread::current()), different parts of the
system have different dependencies - which seems unavoidable to me. I
don't know if it would be possible to enable a subset of the API earlier
in the initialization sequence by refactoring some of the configuration
logic and argument parsing.
David
-----
>
> Or, if that is not possible, would there be a way to delay
> printing of
> early logging calls to after logging initialization and then
> print them out
> in one go? I think this would be not trivial though: one
> would have to
> collect all logging output in memory somewhere - because we
> do not yet know
> which tags are switched on - and then, once -Xlog is parsed,
> filter it by
> tag before printing it out.
>
>
> Yeah that seems difficult/complex given the problem that the VM
> is in the early stages of initialization
>
>
> I really do not like this solution either, I only added this for
> completeness and to make my first proposal look better in comparison :)
>
> What do you think, would that be a worthwhile change? I am a
> bit unhappy
> about how logging calls are quietly swallowed, so for any
> code which runs
> at VM initialization, one always has to keep in mind that UL
> may not yet be
> initialized.
>
>
> Not a new problem (adding more code during VM initialization)
> but one that is getting more complicated :)
>
>
> I think it would perhaps be worthwhile if there's demand for a bunch
> of info to trace level logging from startup code (before argument
> parsing).
>
>
> At least in the AIX port we have a lot of tracing going on very early.
> For platform porters, OS initialization is a very interesting time. We
> have now a very primitive trace there which I would love to switch to
> UL, but right now the trace output would just be swallowed by
> not-yet-initialized UL.
>
> Thank you,
>
> Thomas
>
> Thanks,
> Marcus
>
>
>
> Cheers,
> David
>
> Kind Regards, Thomas
>
>
>
More information about the hotspot-runtime-dev
mailing list