klog's interrupt_received() routine is too heavy-weight
The kernel notifications about klog updates are totally asynchronous (i.e. the kernel does not stop writing to the klog area while the uspace klog task is reading the data).
Thus, reading the area character by character in uspace klog and writing each character to console and file synchronously in the same loop can cause frequent data loss.
In principle, there is no way how to guarantee success in all cases (by design, since the kernel should be always free to write to the klog without any waiting or allocating additional memory for a FIFO), but a more clever design of the uspace klog can probably improve the reliability.