UL: logging before initialization?

David Holmes david.holmes at oracle.com
Mon Mar 14 01:29:15 UTC 2016


On 12/03/2016 12:34 AM, Thomas Stüfe wrote:
> Hi David,
>
> On Fri, Mar 11, 2016 at 1:53 PM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     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>
>         <mailto: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.
>
>
> Not sure I understand.
>
> Making sure that the logging system itself does not contain deep VM
> dependencies should be feasible. If with "logging code" you mean logging
> calls by the various components, I would think that anyone introducing
> logging calls should not log anything which is not available at the time
> the logging call is executed. Or do I not understand?

Just the logging system itself, but dependencies are often not obvious 
inside the VM - eg allocation -> NMT

Thanks,
David

>
> Thomas
>
>         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