This is where replacing the default ActionDispatcher with a custom dispatcher
comes in.  You pass your ActionDispatcher to the Actions widget, and it
invokes actions from any Actions widgets below that one that doesn’t set a
dispatcher of its own.

The first thing Actions does when invoking an action is look up the
ActionDispatcher and pass the action to it for invocation. If there is none,
it creates a default ActionDispatcher that simply invokes the action.

If you want a log of all the actions invoked, however, you can create your own
LoggingActionDispatcher to do the job:

Then you pass that to your top-level Actions widget:

This logs every action as it executes, like so:

Putting it together