I think a potential workaround is to use a ReentrantLock instead of a synchronized block in OutputStreamAppender (line 217). A ReentrantLock offers API through the Lock interface which can be used to implement timeouts when trying to get a lock. This helps in keeping systems responsive (at the cost of loosing log messages).