Nordic's own documentation explains that a "call" to NRF_LOG_PROCESS() processes, at most, one log entry:
infocenter.nordicsemi.com/.../group__nrf__log__ctrl.html
In other words, a "call" to NRF_LOG_PROCESS() may leave log entries still waiting to be processed.
The documentation provides an example of correct usage:
while(1)
{
scheduler();
if (!NRF_LOG_PROCESS())
{
//sleep
}
}
which is found in most of the SDK examples; eg, the ble_app_uart_c Central example:
static void idle_state_handle(void)
{
if (NRF_LOG_PROCESS() == false)
{
nrf_pwr_mgmt_run();
}
}
and yet the ble_app_uart Peripheral example (among others) contains this:
static void idle_state_handle(void)
{
UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
nrf_pwr_mgmt_run();
}
Which is clearly wrong - as it can only process, at most, one log entry before sleeping!!
This results in log messages getting delayed - and not appearing until the next event wakes the system.
So you see new events "releasing" log messages that related to previous events!
Nordic: please go through all the examples and correct all occurrences of this blunder!
EDIT
Corrected code snippet from ble_app_uart Peripheral example - show original Nordic code, not my correction!