Melhores práticas para o log de Java a partir de vários threads?

Eu quero ter um log de diagnóstico produzido por várias tarefas de gerenciamento de dados. Essas tarefas podem estar em vários threads. Cada tarefa precisa gravar um elemento (possivelmente com subelementos) no log; entre e saia rapidamente. Se essa fosse uma situação de tarefa única, eu usaria XMLStreamWriteromo parece ser a melhor correspondência para simplicidade / funcionalidade sem ter que manter um documento XML em balão na memóri

Mas não é uma situação de tarefa única, e não sei como garantir que seja "thread-safe", onde "thread-safe" neste aplicativo significa que cada elemento do log deve ser gravado no log correta e serialmente (um depois do outro e sem intercalar de forma alguma).

Alguma sugestão? Tenho uma vaga intuição de que o caminho a seguir é usar uma fila de elementos de log (com cada um capaz de ser produzido rapidamente: meu aplicativo está ocupado realizando um trabalho real e sensível ao desempenho) e tem um thread separado que lida com o log elementos e os envia para um arquivo para que o registro não interrompa os produtore

O registro não precisa necessariamente ser XML, mas quero que seja estruturado e legível por máquin

edit: eu coloquei "threadsafe" entre aspas. O Log4j parece ser a escolha óbvia (nova para mim, mas antiga para a comunidade), por que reinventar a roda ...

questionAnswers(12)

yourAnswerToTheQuestion