Thanks for all the feedback. As agreed on Slack I am copying Krzysztof and Jakub here so that they see your comments and then, if applicable, we can create one or more issues alongside the ones that Paul has already opened.
Just to follow up after some further inspection:
Introduce a k_sem with initial count 0 and max count UINT_MAX. Log points have the caller give the semaphore every time something is added to the log buffer, and have the background thread simply do a blocking k_sem_take().
On further inspection, we don't even need a semaphore. It appears some wheels were re-invented, we can simply delete all the code subsys/logging/log_list.c and use either a k_queue or k_pipe instead, which the log thread can then sleep on until there's data to write.